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

STM32CubeMX USB CDC CDC_Receive_FS

Здравствуйте, уважаемые разработчики!

Функция принимающая данные вызывается каждый раз при приеме 64-х байт. Если принимается пакет из 128 байт, то она вызывается дважды, при этом при второй пакет из 64-х байт записывается с начала буфера UserRxBufferFS.

Я предполагал, что APP_RX_DATA_SIZE 128 позволит принимать пакеты до 128 байт.

#define APP_RX_DATA_SIZE  128
#define APP_TX_DATA_SIZE  128

uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &UserRxBufferFS[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
	
  return (USBD_OK);
  /* USER CODE END 6 */
}

Функция передачи корректно передает 128 байт:

memcpy(UserTxBufferFS, "01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH01234567ABCDEFGH", 128);
Stat =  CDC_Transmit_FS((uint8_t*)UserTxBufferFS, 128);		

Вопрос к функции приёма. Где я косячу?

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


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

1 hour ago, Pridnya said:

Где я косячу?

 

1 hour ago, Pridnya said:

USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &UserRxBufferFS[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS);

 

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


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

1 hour ago, x893 said:

 

 

А уточнить можете? В данный момент прием пакетов более 64-х байт выполняю склейкой пакетов по 64 байта. 64+64=128, 64+32=96. Каждый раз при вызове функции копирую фрагмент данных в другой массив.

#define APP_RX_DATA_SIZE  64
#define APP_TX_DATA_SIZE  128
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

uint8_t UserRxBuffer[256];
uint8_t UserTxBuffer[256];
uint16_t UsbRxCtr = 0;
uint16_t UsbLenCtr = 0;

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &UserRxBufferFS[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  
  memcpy(UserRxBuffer + (64*UsbRxCtr), UserRxBufferFS, *Len);
  UsbRxCtr++;    
  UsbLenCtr += (*Len);  

  return (USBD_OK);
  /* USER CODE END 6 */
}

 

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


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

25 minutes ago, Pridnya said:

memcpy(UserRxBuffer + (64*UsbRxCtr), UserRxBufferFS, *Len); UsbRxCtr++; UsbLenCtr += (*Len);

Будет выход на границу массива. Логику надо менять.

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


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

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

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

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

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

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

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

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

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

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