问答

汇集网友智慧,解决技术难题

21ic问答首页 - 关于STM32F429IGT6的USB_Device_VPC接收问题

Device STM32F429 pc USB 函数

关于STM32F429IGT6的USB_Device_VPC接收问题

123123adl2020-12-24
调试STM32F429igt6时使用USB的VPC与串口助手通信。发送已经没有问题了,接收的时候发现每次都会接收到除了发送外的额外字节,请问这个怎么处理?下面三张图是编写内容,第一个是在回调函数中添加函数,第二张图就是这个接收函数的处理,第三张图就是将接收长度的数据发送后在串口助手上显示的结果。(后面插图)
回答 +关注 7
4401人浏览 9人回答问题 分享 举报
9 个回答
  • 有时候自己写的函数还是比较适用于自己的特殊情况
  • 即便通过协议 有时候也会收到不需要的乱码
  • 发送的时候会不会发现尾缀
  • 是否需要进行可靠接地
  • 嗯对,进入仿真后。断电打在我自定义的函数前。UserRxBufferFS数组中就已经存在末位多出来的几个乱码字节。所以strlen就将数据计算进去然后发送。我可以通过设定协议的方式避免多了这几个乱码。不过我想了解一下这个乱码是怎么出现的,数量也是不定。是我这种直接读取UserRxBufferFS数组的这种方式是错误的吗?如何直接知道USB接收数据的长度。
  • 问题十有八 九出在strlen()函数上,strlen()函数计算长度的时候,需要检测到0x00才结束,你的用法,strlen()计算的长度比USB实际长度要大
  • 补充一下就是先创建了一些变量: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

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

  • 我直接粘文本吧,这个传图片不太会。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中就已经多了这么几个字节

您需要登录后才可以回复 登录 | 注册