Перейти к содержанию
    

Работа с VCP

Я получаю строку с терминала

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;     
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char strbuf[10]="";

 

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

Изменено пользователем 0men

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char strbuf[10]="";

 

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

объявил. не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

объявил. не помогло.

 

CDC_Send_DATA использует USBD_CDC_TransmitPacket? Посмотрите, что возвращают функции

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

копаю. не могу докопатся.

я посмотрел в демо проекте пользуются флагом

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

ого. фига се. :). пока что уменьшил до 1000 - if(++timeout > 1000) break; - работает стабильно и слава богу. все равно это допольнительная фича для настройки параметров, типа nice-to-have, если лень UART подключать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пошел на другой комп - тоже Windows 7. Втыкаю - не распознается. Скачал с ST сайта vcp driver, установил - все равно не распознается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...