реклама на сайте
подробности

 
 
> Работа с VCP
Jenya7
сообщение Feb 27 2018, 06:16
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я получаю строку с терминала
Код
int main(void)
{
  Set_System();
  Set_USBClock();
  USB_Interrupts_Config();
  USB_Init();

  while (1)
  {
    if (bDeviceState == CONFIGURED)
    {
      CDC_Receive_DATA();
      /*Check to see if we have data yet */
      if (Receive_length  != 0)
      {
        PARSER_ParseCommand((char *)Receive_Buffer);
        Receive_length = 0;
      }
    }
  }
}

Обрабатываю строку и посылаю ответ
Код
CDC_Send_DATA((uint8_t *)strbuf, strlen(strbuf));


Проблема вот в чем - если я ставлю точку останова на самой строке CDC_Send_DATA и потом Step Over - то я вижу ответ в терминале.
А если код свободно бежит - на терминал не приходит ответ. Что то с синхронизацией, не могу понять.

Сообщение отредактировал Jenya7 - Feb 27 2018, 06:18
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
0men
сообщение Feb 27 2018, 11:11
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



char strbuf[10]="";

вот это объявите вне функции - глобально. Она останется аргументом

Сообщение отредактировал 0men - Feb 27 2018, 11:11
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2018, 11:15
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(0men @ Feb 27 2018, 16:11) *
char strbuf[10]="";

вот это объявите вне функции - глобально. Она останется аргументом

объявил. не помогло.
Go to the top of the page
 
+Quote Post
0men
сообщение Feb 27 2018, 11:22
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



Цитата(Jenya7 @ Feb 27 2018, 14:15) *
объявил. не помогло.


CDC_Send_DATA использует USBD_CDC_TransmitPacket? Посмотрите, что возвращают функции
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2018, 11:33
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(0men @ Feb 27 2018, 16:22) *
CDC_Send_DATA использует USBD_CDC_TransmitPacket? Посмотрите, что возвращают функции

для F103 было что то вроде этого. по человечески.
а тут крайне странная функция
Код
uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
  /*if max buffer is Not reached*/
  if(Send_length < VIRTUAL_COM_PORT_DATA_SIZE)    
  {
    /*Sent flag*/
    packet_sent = 0;
    /* send  packet to PMA*/
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
  }
  else
  {
    return 0;
  }
  return 1;
}

ставлю точку останова на UserToPMABufferCopy - вижу ptrBuffer = 10 Send_length = 2 - все верно. и на терминале вижу - 10. без точки останова - на терминал не приходит ничего.

Сообщение отредактировал Jenya7 - Feb 27 2018, 11:40
Go to the top of the page
 
+Quote Post
0men
сообщение Feb 27 2018, 11:55
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



Цитата(Jenya7 @ Feb 27 2018, 14:33) *
ставлю точку останова на UserToPMABufferCopy - вижу ptrBuffer = 10 Send_length = 2 - все верно. и на терминале вижу - 10. без точки останова - на терминал не приходит ничего.


Значит надо копать внутрь этих функций.

Сообщение отредактировал IgorKossak - Feb 28 2018, 08:27
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2018, 12:10
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(0men @ Feb 27 2018, 16:55) *
Значит надо копать внутрь этих функций.

копаю. не могу докопатся.
я посмотрел в демо проекте пользуются флагом
Код
if (packet_sent == 1)
    CDC_Send_DATA((uint8_t *)Receive_Buffer, strlen((char *)Receive_Buffer));

этот флаг устанавливается в
Код
void EP1_IN_Callback (void)
{
  packet_sent = 1;
}

я вставил костыль
Код
uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
    uint32_t timeout=0;

  /*if max buffer is Not reached*/
  if(Send_length < VIRTUAL_COM_PORT_DATA_SIZE)    
  {

     //------moi kostyl---------------

     while(packet_sent == 0)
     {
         if(++timeout > 10000) break;
     }
    //---------------------------------
    
    /*Sent flag*/
    packet_sent = 0;
    /* send  packet to PMA*/
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
    SetEPTxCount(ENDP1, Send_length);
    SetEPTxValid(ENDP1);
  }
  else
  {
    return 0;
  }
  return 1;
}

так работает но мне это не нравиться. как можно разрулить это красивее?

Сообщение отредактировал Jenya7 - Feb 27 2018, 13:47
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016