历史上的今天
今天是: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中断吧。
这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)
下面以STM32F103为例给出源程序。
我们先来看程序中的主要部分。
串口初始化函数片段
如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。
串口中断函数
串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
主函数
我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。
上图是结果验证
史海拾趣
|
程序中,duty为控制占空比的参数;count为控制分频的参数。通过改变duty和count两个参数,得到占空比及分频数可调的时钟信号,极为方便。 2.2 其他模块的实现 其他控制模块包括地址发生器、DAC控制电路、并/串转换电路。存储数据 ...… 查看全部问答> |
|
哪位大侠能提供一下nor flash M29W128G 的fast program 的代码 nor flash M29W128G 可以32个words fast program, 哪位大哥有这个写的代码,能否给小弟一下,谢谢了。… 查看全部问答> |
|
平台:6410+WINCE6.0 新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教, 用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给di ...… 查看全部问答> |
|
我主要想知道硬件编解码之前的数据是什么格式或者封装的?之后应该就是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},在这个位置并不能完 ...… 查看全部问答> |
|
野火STM32开发板,买的是428的套餐,买到手里1个多月,没用过,就是刚到手里的时候吧包装拆开了,现打算350包邮出,有意的可以直接拍下,帮我同学卖的,不刀,要的可以联系我QQ 99044007 照片就不上了,没有任何的使用,所以也不需要看 ...… 查看全部问答> |




