芯片: stm32f429zgt6
stm32cube: 1.14.1
使用cube自动生成usb_otg_fs代码
未作任何修改,仅将接收函数与发送函数加以应用,下载到板子能收也能发,但是有个问题,上位机通过串口读取数据,多次来回会出现板子发送不出数据但是能正常接收,断点调试也显示ok, 但是上位机未显示数据(上位机没问题,通过多个第三方串口发送也是如此),再次发送后,板子会将上次的数据返回,并没有返回此次应该返回的数据,待下次发送才返回(或者多次未返回,后续一次性返回多个数据,但存在丢失部分),如此出现交错帧,错过几次之后就再也无法发出数据,但接收依然正常,收取与发送均不超过64字节,如果由单片机主动单方向一直发送也不会有问题。
主函数轮询读取环形队列接收的数据,并解析,通过发送函数返回数据
//发送函数
static int usb_send(int32_t inode, const void *pbuf, int32_t length, int32_t offset)
{
if (USB_INODE != inode)
return -1;
memcpy(s_tx_buf_temp, pbuf, length);
CDC_Transmit_FS(s_tx_buf_temp, length);
return 0;
}
//接收函数,丢到环形队列,由外部函数解析对应帧
int8_t CDC_Receive_FS(uint8_t *Buf, uint32_t *Len)
{
uint32_t wr_index = 0;
static uint32_t rd_index = 0;
memcpy(&s_rx_buf_temp[rd_index], Buf, *Len);
wr_index = rd_index + *Len;
if (wr_index == rd_index)
{
return -1;
}
else if (wr_index > rd_index)
{
ring_fifo_put(&s_rxfifo, &s_rx_buf_temp[rd_index], wr_index - rd_index);
}
else
{
ring_fifo_put(&s_rxfifo, &s_rx_buf_temp[rd_index], USB_RX_SIZE - rd_index);
ring_fifo_put(&s_rxfifo, s_rx_buf_temp, wr_index);
}
rd_index = wr_index % USB_RX_SIZE; // 更新 rd_index,确保在环形缓冲区内循环
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}