本文摘要:
上一篇的文章中,分享了串口UART硬件电平匹配。这里分享下串口通信软件数据吸收中容易遇到的问题解决思路。这里说的软件是指嵌入式底层中的驱动软件,本文以常用MCU为例。 串口通信有吸收和发送。串口数据发送,软件挪用发送函数一般都不太会泛起问题,因为发送主体是我们的自己芯片,发送的花样、巨细、时间距离,它们都是确定可控的,所以挪用发送函数即可。
上一篇的文章中,分享了串口UART硬件电平匹配。这里分享下串口通信软件数据吸收中容易遇到的问题解决思路。这里说的软件是指嵌入式底层中的驱动软件,本文以常用MCU为例。
串口通信有吸收和发送。串口数据发送,软件挪用发送函数一般都不太会泛起问题,因为发送主体是我们的自己芯片,发送的花样、巨细、时间距离,它们都是确定可控的,所以挪用发送函数即可。数据的吸收就有比力多的不确定性,好比吸收到的数据巨细可能不确定,数据与数据之间的发送时间距离也可能不确定,纵然它们都是确定,通讯时接到夹杂着滋扰信号,软件没处置惩罚好,也很是容易泛起通讯问题。
串口数据吸收通讯问题,从现象分常见的有通讯卡死就是没反映(甚至是引起MCU死机),另外是引起数据丢包现象。分析原因可大致分为以下几点:吸收字符串数据数组长度设置偏小不合理。实际数据长度超出吸收字符串长度,长度溢出没掩护处置惩罚。
单帧数据存储没有设置超时时间。吸收中断中处置惩罚太多法式。MCU串口吸收常用的是用芯片自带的UART模块吸收中断来实现,一次中断吸收1个字节数据。如果单单只看原因比力不容易明白,我假设用9600波特率通信举例说明一下。
假设我手上有一个MCU需要和一个模组通信,我们约定好通信协议:通信协议1.吸收字符串数据数组长度设置偏小不合理。MCU假设收到数据 F2 F3 01 02 03 04 88,数据长度是牢固的, 吸收到7个字节,所以MCU吸收数据的数组长度要>=7。
这比力容易明白,如果吸收数据长度不是牢固的,一定要确保数据的长度大于会吸收到最长的数据实际长度。2.实际数据长度超出吸收字符串长度,长度溢出没掩护处置惩罚。

假设MCU设置了最长可以吸收长度7,实际可能存在滋扰MCU吸收到了数据是 F2 F3 01 02 03 04 # ###.... 共300个字节的数据。假设法式这么界说char R_a【7】;//数组7个字节 存储数据char i=0; // 作为R_a数组的下标i生存数据后R_a【0】= F2R_a【1】= F3...R_a【6】= # //界说7个数据 生存竣事了... //异常数据R_a【254】=# R_a【-1】=# ..... //异常数据异常数据会引起通讯异常,另有可能引起MCU死机。

所以一定要设置一个吸收数据长度溢出掩护。if(i>6){i=0;}3.单帧数据存储没有设置超时时间。
如果没有设置超时时间,假设开始吸收到了2个字节直接的滋扰信号 R_a【0】= # ;R_a【1】= # ;然后模组给MCU发送过来正常的数据F2 F3 01 02 03 04 08 ,那么它吸收到的数据会是:R_a【0】= #R_a【1】= #R_a【2】= F2R_a【3】= F3...R_a【6】=03那么很显然通信会泛起问题,如果法式处置惩罚欠好还会泛起连锁反映,把04 08重新存储到R_a【0】,R_a【1】,这样就是一个死循环,一个滋扰把通信系统打卡死了。波特率9600,传输的速率是0.83ms字节,如果我们设置了超时时间1ms,如果数据帧凌驾1ms没有吸收到数据就认为该数据帧竣事。那么上述3问题就可以解决。吸收到滋扰信号 R_a【0】= # ;R_a【1】= # ;如果凌驾1ms没数据,我们将 i 清0,那么下一帧数据就能正常就收了。
如果在1ms内发送过来了正常数据,那么这帧数据是夹杂着滋扰信号,等这帧数据竣事后抛弃, i 清0,下一帧数据也能正常吸收。4.吸收中断中处置惩罚太多法式。
以9600波特率为例,1个字节有8bit数据,串口的流传速率是0,104ms/bit,如果你在吸收中断中处置惩罚太多法式影响MCU吸收相应速率那么就会泛起丢包的现象。这种现象在于MCU大量数据通信的时候容易泛起,好比与GPRSNB-IOT模组通信,有大量的通信信息需要交互,如果处置惩罚不妥容易丢包。
处置惩罚方法也比力简朴就是不要在中断中去过多处置惩罚数据,数据吸收存储竣事后,可以在主函数里处置惩罚,这样就不会影响串口吸收中断吸收数据了。上文所述的4点应该是串口吸收软件中比力常见的问题,大家有没有遇到过相关问题或者其它增补,接待评论分享,一起学习。
本文关键词:串口,UART,通信,之,软件,数据,吸收,天博体育官方入口,上,一篇,的
本文来源:天博体育官方入口-www.maoketour.com