历史上的今天
返回首页

历史上的今天

今天是:2025年08月02日(星期六)

2020年08月02日 | STM32串口接收不定长数据原理与源程序

2020-08-02 来源:51hei

今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。


IDLE中断什么时候发生?
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。


如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。


看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。


如何配置好IDLE中断?


下面我们就配置好串口IDLE中断吧。
%E4%B8%B2%E5%8F%A3%E6%8E%A5%E6%94%B6%E5%A4%9A%E5%AD%97%E8%8A%821.png?imageView2/2/w/550
这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
%E4%B8%B2%E5%8F%A3%E6%8E%A5%E6%94%B6%E5%A4%9A%E5%AD%97%E8%8A%822.png?imageView2/2/w/550
这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.


需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)


下面以STM32F103为例给出源程序。
我们先来看程序中的主要部分。
串口初始化函数片段
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD.png?imageView2/2/w/550
如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。


串口中断函数
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD2.png?imageView2/2/w/550
串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
主函数
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD3.png?imageView2/2/w/550
我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。
%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD4.png?imageView2/2/w/550
上图是结果验证

推荐阅读

史海拾趣

BULGIN公司的发展小趣事

在1939年至1945年的二战期间,BULGIN的产能被英国政府全面征用。为了满足战时需求,BULGIN公司开发出能够适应全世界各地区苛刻使用环境的产品。在这段时间里,公司为英国政府制造了超过1千万只零部件,并在密封技术领域积累了宝贵的经验,这些经验一直延续至今。

Dfx公司的发展小趣事

随着智能家居市场的不断发展,某智能家居企业面临着如何将各种智能设备无缝连接、实现高效协同的挑战。通过引入DFX的设计理念,该企业成功实现了智能家居产品的标准化、模块化和可扩展性设计。这种设计方式使得不同设备之间可以方便地进行连接和通信,提高了系统的整体性能和用户体验。同时,该企业还通过优化生产流程和加强质量控制等手段,确保了产品的稳定性和可靠性。

这些故事虽然基于虚构的情境,但融入了电子行业中常见的实际问题和发展趋势。通过引入DFX的设计理念,这些企业成功解决了面临的挑战,提升了产品竞争力并赢得了市场的认可。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

在智能手机行业快速发展的背景下,某知名手机制造商面临着如何将更多功能集成到更小空间的挑战。通过引入DFX的设计理念,该公司成功实现了硬件的小型化,同时保持了高性能和可靠性。通过优化内部布局、采用先进封装技术和选用高性能元器件,该手机制造商在保持产品竞争力的同时,满足了消费者对轻薄、高性能手机的需求。

杰力(EMC)公司的发展小趣事

为了确保产品质量和客户满意度,杰力建立了一套完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理。同时,杰力还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施使得杰力的产品在质量上得到了有效保障,并赢得了客户的信赖和好评。

Electromagnetic Industries Llp公司的发展小趣事

作为一家有社会责任感的企业,EMI公司不仅关注经济效益的增长,还积极履行社会责任。公司积极参与各种公益活动和社会救助行动,为灾区捐款捐物、支持教育事业等。同时,公司还注重环保和可持续发展,通过引进环保技术和设备、加强废弃物处理等措施降低生产过程中的环境污染。这些行动展现了EMI公司的良好企业形象和社会责任感。

芯源半导体(CW)公司的发展小趣事

随着公司产品的逐步成熟,芯源半导体(CW)公司开始寻求与行业内其他企业的合作。经过深入的市场调研和谈判,公司成功与多家知名电子企业建立了战略合作伙伴关系。这些合作伙伴为芯源半导体(CW)公司提供了更多的市场机会和技术支持,使公司得以迅速扩大市场份额,提升品牌影响力。

问答坊 | AI 解惑

无线收发模块汇总

本帖最后由 paulhyde 于 2014-9-15 09:06 编辑 :P :P :P :P :P :P :P :P :P :P :P 好东西大家一起分享!!!  …

查看全部问答>

采用FPGA的可编程电压源系统原理及设计2

程序中,duty为控制占空比的参数;count为控制分频的参数。通过改变duty和count两个参数,得到占空比及分频数可调的时钟信号,极为方便。 2.2 其他模块的实现     其他控制模块包括地址发生器、DAC控制电路、并/串转换电路。存储数据 ...…

查看全部问答>

哪位大侠能提供一下nor flash M29W128G 的fast program 的代码

nor flash M29W128G 可以32个words fast program, 哪位大哥有这个写的代码,能否给小弟一下,谢谢了。…

查看全部问答>

Camera 应用开发

平台:6410+WINCE6.0 新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教,    用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给di ...…

查看全部问答>

6410硬件编解码的一点疑问?

我主要想知道硬件编解码之前的数据是什么格式或者封装的?之后应该就是H.264,MPEG-4之类的吧。之前呢?通过以太网接口的以太网数据帧(应该包含视频流的)能直接通过硬件编解码进行播放吗? 还有TV-in,进来的是什么数据?那个接口是接什么的? ...…

查看全部问答>

大家帮我看看我的内核出了什么问题

第一次来这里,谢谢大家 刚开始做做BSP5.0移植到6.0 现在编出来的内核打印信息如下: Windows CE Kernel for ARM (Thumb Enabled) Built on Sep  6 2006 at 19:14:27 INFO:OALLogSetZones: dpCurSettings.ulZoneMask: 0xb OEM: Not ...…

查看全部问答>

如何禁用蓝牙、红外线等设备?

想写一个过滤驱动,实现禁用蓝牙,红外线等设备, 请问要将过滤驱动挂载在注册表的什么地方? 我发现过载在 注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentConrolSet\\Control\\Class\\{E0CBF06C-CD8B-4647-BB8A-263B43F0F974},在这个位置并不能完 ...…

查看全部问答>

cpu怎么访问硬盘的

各位大侠,小弟有点不明白,32位地址总线的CPU,最大可以读到2@32,也就是4G的地址,那么160G的硬盘,它怎么读到的呢?直接访问好像访问不到吧?谢谢了…

查看全部问答>

msgQreceive返回error,表示什么?

是代表队列没数据,还是什么错误啊?一般都是什么引起的?多谢啊…

查看全部问答>

出一块STM32野火开发板99新

野火STM32开发板,买的是428的套餐,买到手里1个多月,没用过,就是刚到手里的时候吧包装拆开了,现打算350包邮出,有意的可以直接拍下,帮我同学卖的,不刀,要的可以联系我QQ 99044007  照片就不上了,没有任何的使用,所以也不需要看 ...…

查看全部问答>