|
|
  |
Работа с VCP |
|
|
|
Feb 27 2018, 06:16
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 27 2018, 11:07
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(0men @ Feb 27 2018, 15:25)  strbuf попробуйте объявить как глобальный массив он у меня аргумент функции. генерик функция посылает или по UART или по USB. Код void Parser_SendInt(USART_TypeDef *USARTx, int32_t number, uint32_t cr, uint32_t out) { char strbuf[10]=""; uint32_t sign = 0; if (number<0) { number *= -1; sign = 1; } ItoA(number, strbuf); switch (out) { case 0: //UART if (sign) USART_SendString(USARTx,"-"); USART_SendString(USARTx,strbuf); if(cr) USART_SendString(USARTx,"\r"); break; case 1: //USB if (sign) CDC_Send_DATA((uint8_t *)"-", 1); CDC_Send_DATA((uint8_t *)strbuf, strlen(strbuf)); if(cr) CDC_Send_DATA((uint8_t *)"\r", 1); break; } }
|
|
|
|
|
Feb 27 2018, 11:22
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(Jenya7 @ Feb 27 2018, 14:15)  объявил. не помогло. CDC_Send_DATA использует USBD_CDC_TransmitPacket? Посмотрите, что возвращают функции
|
|
|
|
|
Feb 27 2018, 11:33
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 27 2018, 11:55
|
Частый гость
 
Группа: Участник
Сообщений: 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
Причина редактирования: бездумное цитирование
|
|
|
|
|
Feb 27 2018, 12:10
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 27 2018, 19:01
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Тоже плевался на реализацию куба, пока отложил, есть другие задачи, но общее решение у меня нарисовалось вот какое (надо проверить) :
1. Отправка данных через функцию, в которой проверка, отправляется ли в данный момент по usb что-то или нет. Если да - добавляем в буфер, нет - вызываем CDC_Send_DATA с размером точки, остальное в буфер, ставим флаг активности. 2. В EP1_IN_Callback смотрим, есть что в буфере или нет. Есть - CDC_Send_DATA с размером точки (если данных больше), кончились данные - снимаем флаг
|
|
|
|
|
Feb 28 2018, 06:13
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(toweroff @ Feb 28 2018, 01:01)  Тоже плевался на реализацию куба, пока отложил, есть другие задачи, но общее решение у меня нарисовалось вот какое (надо проверить) :
1. Отправка данных через функцию, в которой проверка, отправляется ли в данный момент по usb что-то или нет. Если да - добавляем в буфер, нет - вызываем CDC_Send_DATA с размером точки, остальное в буфер, ставим флаг активности. 2. В EP1_IN_Callback смотрим, есть что в буфере или нет. Есть - CDC_Send_DATA с размером точки (если данных больше), кончились данные - снимаем флаг ого. фига се.  . пока что уменьшил до 1000 - if(++timeout > 1000) break; - работает стабильно и слава богу. все равно это допольнительная фича для настройки параметров, типа nice-to-have, если лень UART подключать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|