OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5999|回复: 10

STM32 HAL库USB VCP的一些问题

[复制链接]

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
发表于 2019-1-15 14:23:33 | 显示全部楼层 |阅读模式
20金钱
      本人是基于STM32F4系列单片机进行的USB VCP开发。因为HAL库给提供了很好的USB库,只要在CDC_Transmit_FS和CDC_Receive_FS自己编写发收代码即可。如下为自己基于单个byte的接受代码。
      [mw_shl_code=c,true]int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)   //当作中断来处理
{
    uint32_t i = 0;

    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
   
    for(i=0;i<*Len;i++)
    {
      USB_VCP_AddReceived( *(Buf + i) );
    }

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

       后来了解到USB可以一帧一帧的去接收数据的,我自己也觉得自己定义单个Byte去接受数据的话,整个代码的效率可能


差一些,另外一帧一帧接受数据的话,也有利于识别。所以就改成如下的接受代码。
[mw_shl_code=c,true]uint8_t USB_RX_Buffer[1024];

int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)   //当作中断来处理
{

    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &USB_RX_Buffer);
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
   
        USB_Reveive_Flag=1;
}

int main
[
        if(USB_Receive_Flag)
        {
                USB_Receive_Flag
                /*UserCode*/
        }
}[/mw_shl_code]

      后来我就在UserCode这里打上断电,发现USB接收的数据后面总是会多出一些Byte,比如我说我发了
AAABBB,打出来的数据是AAABBB?.。总是你发给他的数据不会少,只会多。不知道这是什么问题,有经
验的朋友可以帮我看看。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-1-15 15:28:31 | 显示全部楼层
其实我并不是很了解您的问题.
不确定您在int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {} 里面是否有特别对 *Len 做处理?
另外有一点疑问就是 CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {} 运行之后, 立马他又拿相同buffer去收下一笔data, 这个会不会造成main() 在处理这个buffer的时候CDC又收到新的data把原本buffer里面的内容覆盖掉?
回复

使用道具 举报

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
 楼主| 发表于 2019-1-15 15:41:17 | 显示全部楼层
       因为我程序当中使用\r作为结束标志,所以我只关心\r前面的数据而不用关心\r后面的数据,即使我
后面出现错误的数据,我只要找到\r这个字节所在的位置替换成'\0',然后strcpy到另外一个字符数组当中
去,然后去处理这个正确的字符串。虽然基于我的项目应用解决了这个问题,但是在硬件层面上,你接收到
的数据错的那就是错的!
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-1-15 15:52:29 | 显示全部楼层
在PC上面装BusHound看丢给MCU的确切数组是什么.
同时, 在STM32程序里面的int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {} 设断点.
比较BusHound看到的, 和这边看到的, 有什么差异.
回复

使用道具 举报

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
 楼主| 发表于 2019-1-15 16:42:57 | 显示全部楼层
sammy902583 发表于 2019-1-15 15:52
在PC上面装BusHound看丢给MCU的确切数组是什么.
同时, 在STM32程序里面的int8_t CDC_Receive_FS(uint8_t*  ...

     我是将数据打印到串口调试助手并且也打断点在程序空看了那个buffer,
确实多了数据。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-1-21
在线时间
7 小时
发表于 2019-1-21 12:16:27 | 显示全部楼层
uint8_t USB_DR_TmpBuffer[500];
uint32_t USB_DR_TmpLength;        //// DEVICE CDC接收到的数据长度


static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  uint32_t index = 0;
  uint32_t TmpLenth = 0;
  uint32_t j = 0;

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

    memcpy(USB_DR_TmpBuffer, Buf, *Len);
    USB_DR_TmpLength = *Len;


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

像我这样改下试试,关键是这句“ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
”改动了,数据会有异常的。
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-9
在线时间
8 小时
发表于 2019-8-5 14:55:41 | 显示全部楼层
怎么会多呢,我的也多了,就多了“-”这个字符
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-9
在线时间
8 小时
发表于 2019-8-5 15:42:01 | 显示全部楼层
接收好像最大只能接收64字节吧
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-9
在线时间
8 小时
发表于 2019-8-6 10:02:27 | 显示全部楼层
JQChris 发表于 2019-1-15 16:42
我是将数据打印到串口调试助手并且也打断点在程序空看了那个buffer,
确实多了数据。

楼主,你好,接收数据是不是最大只能接受64字节
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-9-11
在线时间
37 小时
发表于 2020-3-18 21:09:19 | 显示全部楼层
老哥我也是这个原因,请问你是怎么解决的
回复

使用道具 举报

13

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-8-7
在线时间
40 小时
发表于 2020-9-7 18:51:32 | 显示全部楼层
中断一次最大只能接收64字节,接收中断标志位在下次中断来之前会被挂起,第三次中断的时候该中断已经被禁用了。简单来说,接收数据>128的时候,就挂掉了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 14:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表