STM32 USB虚拟串口收发任意长度字节例程

STM32 USB虚拟串口收发任意长度字节例程

创建STM32 CubeMX工程

基于STM32 CubeMX进行开发,使用USB的高速模式(实际使用的是内部的phy芯片),用USART3串口进行打印调试,外设管脚配置如下
外设管脚配置图
中断优先级配置如下:
在这里插入图片描述
系统时钟配置如下:
在这里插入图片描述
最后,在生成工程前,需要配置堆和栈的大小,这里建立配置都在0x600以上,否则USB识别的速度比较慢且可能出现不识别的情况。在这两个工程中,设置如下图所示
在这里插入图片描述
到这里,STM32 USB虚拟串口的底层搭建完成,点击生成代码即可,接下来进行虚拟串口的开发。

代码修改

主函数不进行讲解,主要要修改将要讲解的两个函数,并在主函数中进行调用就可以实现USB的收发任意字节长度(协议允许范围内)的功能。
根据CubeMX生成的底层代码,USB CDC类提供接口函数存放在usbd_cdc_if.c文件中,其中包含CDC_Control_HS()、CDC_Receive_HS()和CDC_Transmit_HS()三个函数。根据USB 2.0协议,USB的数据包最大长度为64 Byte。此外,当USB采用分包接收时,若出现数据长度为64的整数倍,接收端无法接收到数据,出现这种现象的原因与USB传输协议有关(若接收到的数据包长不足最大包长时,则认为当前传输完成;等于最大包长没有被支持)。USB CDC虚拟串口要求支持任意字节长度(1024Byte以下)的数据传输,为解决这个问题,做如下修改(避开内部协议,有尝试修改内部协议后出现跑飞现象)。
修改发送函数。如数据包大于等于64字节,分包发送并且手动发送一个空包表示发送结束。
在这里插入图片描述
修改接收函数。采用标志位的形式,在其他地方进行接收处理,接收数据存放在Buf指向的内存中。
在这里插入图片描述

收发任意长度测试

发送长度为128byte的数据包,要求回传123byte,效果如下,准确回传。
在这里插入图片描述
发送128byte的数据包,要求回传128byte,效果如下,准确回传。
在这里插入图片描述
当数据包长度小于等于64时,不需要分包接收;当数据包长度大于64时,根据数据包大小分包接收,如果没有设计专门的接收缓存,必须接收完成才能发送。否则,可能会造成后面数据覆盖前面的数据。

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值