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

 
 
 
Reply to this topicStart new topic
> Работа с 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
0men
сообщение Feb 27 2018, 10:25
Сообщение #2


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

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



strbuf попробуйте объявить как глобальный массив
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2018, 11:07
Сообщение #3


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

Группа: Участник
Сообщений: 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;    
    }
}
Go to the top of the page
 
+Quote Post
0men
сообщение Feb 27 2018, 11:11
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


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

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Участник
Сообщений: 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
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


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

Группа: Участник
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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
toweroff
сообщение Feb 27 2018, 19:01
Сообщение #10


Гуру
******

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



Тоже плевался на реализацию куба, пока отложил, есть другие задачи, но общее решение у меня нарисовалось вот какое (надо проверить) :

1. Отправка данных через функцию, в которой проверка, отправляется ли в данный момент по usb что-то или нет. Если да - добавляем в буфер, нет - вызываем CDC_Send_DATA с размером точки, остальное в буфер, ставим флаг активности.
2. В EP1_IN_Callback смотрим, есть что в буфере или нет. Есть - CDC_Send_DATA с размером точки (если данных больше), кончились данные - снимаем флаг

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 28 2018, 06:13
Сообщение #11


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

Группа: Участник
Сообщений: 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 с размером точки (если данных больше), кончились данные - снимаем флаг

ого. фига се. sm.gif. пока что уменьшил до 1000 - if(++timeout > 1000) break; - работает стабильно и слава богу. все равно это допольнительная фича для настройки параметров, типа nice-to-have, если лень UART подключать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Aug 13 2018, 15:56
Сообщение #12


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

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



Пошел на другой комп - тоже Windows 7. Втыкаю - не распознается. Скачал с ST сайта vcp driver, установил - все равно не распознается.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 17:33
Рейтинг@Mail.ru


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