STM32 USART与USB接收不定数据方法,标准库、HAL库都适用
2025-02-19 来源:cnblogs
很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来,
为了解决这个不定数据接收问题,在此各提供一个解决思路。
串口数据不定接收:
由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,
由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一
次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以
叫做一包数据。
还有一个RXNE中断,当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就
会产生IDLE中断。比如给单片机一次性发送8个字节,就会产生8次RXNE中断,1次IDLE中断。
这里只写RXNE中断例子,IDLE中断的类似,只是寄存器地址不同,各位可以查手册编写。
eg:
在中断服务函数里添加一下代码,函数外部定义 buff[ ] 和 i=0 ; 我这里使用的是串口1:
if(UASART_GetITStatus(UASART1, UASART_IT_RXNE != RESET)) //接收一个字节判断
{
buff [i++] = UASART1->DR; //把接收到的字节保存到数组后,数组下标自加1
}
就这么几句代码就可以实现了,buff[ ],就是接收到的数据,i-1 就是数据长度了
=======================================================================
USB不定数据接收:
usb不定数据接收,利用了定时器作为校验来接收,这个方法通用性强,适用于uasart也适用于usb,还使用于hal库。不过这个方法有一个局限性,就是PC端发送数据过来的时间间隔不可以太短,否则会出现误判情况。
定时器方法的原理是:先定时一个时间间隔合适的时间,一般几毫秒就可以了,然后在接收服务函数里把接收到的数据存到buff[ ],i++,接着定时器计数值清0,打开定时器,如果数据没接受完,每次接收都清空了定时器计数器,使得定时器无法进入定时器中断。如果数据接收完成了,则过不会清空定时器计数器,进入定时器中断,此时则判断数据已经接收完成,可以在定时器中断中取出数据和数据长度。
eg:
这里我是用HAL库作为例子,在usbd_cdc_if.c文件中找到USB接收中断服务函数,在里面
修改代码即可。




因为usb发送,每发送最大包是64个字节,而且usb接收可以自己算出接收长度,不过超过64字节就会出错,所以我这里进行了一个最大包处理。
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




