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时,根据数据包大小分包接收,如果没有设计专门的接收缓存,必须接收完成才能发送。否则,可能会造成后面数据覆盖前面的数据。