Pridnya 0 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба Здравствуйте, уважаемые разработчики! Функция принимающая данные вызывается каждый раз при приеме 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); Вопрос к функции приёма. Где я косячу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба 1 hour ago, Pridnya said: Где я косячу? 1 hour ago, Pridnya said: USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &UserRxBufferFS[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pridnya 0 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба 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 */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 23 ноября, 2021 Опубликовано 23 ноября, 2021 · Жалоба 25 minutes ago, Pridnya said: memcpy(UserRxBuffer + (64*UsbRxCtr), UserRxBufferFS, *Len); UsbRxCtr++; UsbLenCtr += (*Len); Будет выход на границу массива. Логику надо менять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться