打印

关于STM32F429IGT6的USB_Device_VPC接收问题

[复制链接]
4558|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
123123adl|  楼主 | 2020-12-24 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试STM32F429igt6时使用USB的VPC与串口助手通信。发送已经没有问题了,接收的时候发现每次都会接收到除了发送外的额外字节,请问这个怎么处理?下面三张图是编写内容,第一个是在回调函数中添加函数,第二张图就是这个接收函数的处理,第三张图就是将接收长度的数据发送后在串口助手上显示的结果。(后面插图)

使用特权

评论回复
沙发
123123adl|  楼主 | 2020-12-24 09:34 | 只看该作者

关于STM32F429IGT6的USB_Device_VPC接收问题

使用特权

评论回复
板凳
123123adl|  楼主 | 2020-12-24 09:37 | 只看该作者

关于STM32F429IGT6的USB_Device_VPC接收问题

我直接粘文本吧,这个传图片不太会。1.static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  USB_Uartx_RxCpltCallback();//添加的自定义回调函数
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}
第一个是在回调函数中添加一个函数
2.void USB_Uartx_RxCpltCallback(void)
{
        uint16_t usb_rx_len = 0;
        usb_rx_len = strlen((char*)UserRxBufferFS);
        if((usb_rdat_length+usb_rx_len)<USB_DAT_LENMAX)//不超过内存最大值
        {
                memcpy(usb_rdat+usb_rdat_length,UserRxBufferFS,usb_rx_len);//内存赋值
                usb_rdat_length+=usb_rx_len;
        }
        memset(UserRxBufferFS,0x00,usb_rx_len);
}
第二个就是将缓存数据存在usb_rdat[]中。
3.[09:20:46.339]发→◇31 32 33 34 35 0D 0A □
[09:20:46.344]收←◆31 32 33 34 35 0D 0A 5E
[09:20:47.021]发→◇31 32 33 34 35 0D 0A □
[09:20:47.026]收←◆31 32 33 34 35 0D 0A 5E
[09:20:47.296]发→◇31 32 33 34 35 0D 0A □
[09:20:47.302]收←◆31 32 33 34 35 0D 0A 5E
[09:20:47.514]发→◇31 32 33 34 35 0D 0A □
[09:20:47.519]收←◆31 32 33 34 35 0D 0A 5E
第三个就是串口助手返回的数据。可以看到每次返回都会多出几个字节,进入仿真可以看到在UserRxBufferFS中就已经多了这么几个字节

使用特权

评论回复
地板
123123adl|  楼主 | 2020-12-24 09:40 | 只看该作者

关于STM32F429IGT6的USB_Device_VPC接收问题

补充一下就是先创建了一些变量:static uint8_t usb_rdat[USB_DAT_LENMAX];
static uint16_t usb_rdat_length = 0;




然后使用串口助手
[09:38:33.260]发→◇64 73 66 61 73 66 □
[09:38:33.266]收←◆64 73 66 61 73 66 18 47
[09:38:34.916]发→◇64 73 66 61 73 66 □
[09:38:34.921]收←◆64 73 66 61 73 66 18 47
[09:38:35.095]发→◇64 73 66 61 73 66 □
[09:38:35.102]收←◆64 73 66 61 73 66 18 47
[09:38:35.284]发→◇64 73 66 61 73 66 □
[09:38:35.289]收←◆64 73 66 61 73 66 18 47

可以看到每次增加的字节长度都是不定长的。

使用特权

评论回复
5
sonicll| | 2020-12-24 11:41 | 只看该作者
问题十有八 九出在strlen()函数上,strlen()函数计算长度的时候,需要检测到0x00才结束,你的用法,strlen()计算的长度比USB实际长度要大

使用特权

评论回复
6
123123adl|  楼主 | 2020-12-24 19:09 | 只看该作者

关于STM32F429IGT6的USB_Device_VPC接收问题

嗯对,进入仿真后。断电打在我自定义的函数前。UserRxBufferFS数组中就已经存在末位多出来的几个乱码字节。所以strlen就将数据计算进去然后发送。我可以通过设定协议的方式避免多了这几个乱码。不过我想了解一下这个乱码是怎么出现的,数量也是不定。是我这种直接读取UserRxBufferFS数组的这种方式是错误的吗?如何直接知道USB接收数据的长度。

使用特权

评论回复
7
guanjiaer| | 2021-1-11 12:04 | 只看该作者
是否需要进行可靠接地

使用特权

评论回复
8
heimaojingzhang| | 2021-1-11 12:05 | 只看该作者
发送的时候会不会发现尾缀

使用特权

评论回复
9
keaibukelian| | 2021-1-11 12:07 | 只看该作者
即便通过协议 有时候也会收到不需要的乱码

使用特权

评论回复
10
labasi| | 2021-1-11 12:08 | 只看该作者
有时候自己写的函数还是比较适用于自己的特殊情况

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝