首页 > 编程知识 正文

单片机串口查询接收数据,串口中断接收数据处理

时间:2023-05-05 20:03:50 阅读:138758 作者:787

单片机接收的几种常用数据处理方法一、为什么串口接收的数据需要处理

我们做项目的时候经常用串口。 使用串行端口与其他设备通信时,必须严格遵守通信协议。 但是,仅仅遵循通信协议是不够的。 因为单片机的串口受到其他信号干扰时,容易发生数据错误。 特别是串行端口发送的第一个和最后一个字节。 如果出现这种情况,机器之间的通信可能会受到影响,或者系统可能会停止。 此外,当串行端口收到数据时,还需要确定一帧数据的长度。 特别是在命令发送频繁的情况下。 因此,串行端口在接收到数据后,必须在执行命令之前进行数据处理。 这样可以提高产品的稳定性。

二、串口接收重点关注的几个标志

为了保证通信的稳定性,在一般的通信协议中增加帧头、帧尾、数据长度、检查四个标志中的一个或多个。 这些作用如下

1、帧头:串行端口发送数据的第一个字节最容易出错。 如果你将重要的指令放在第一个字节上,发生错误时可能会使从站执行错误的操作。 帧头可以有效地避免这个问题。

2、帧末端:与帧报头一样,帧末端也可避免最后一个字节的错误,同时也可用作接收端的接收完成标志。

3、数据长度:可用作接收方接收完成的标志。 有时也可以用作判断数据是否正确的标志。

4、验证:虽然可以有效避免除验证外的所有数据错误,但验证正确并不意味着数据一定没有错误,而是每种验证方式都存在一定的缺陷。

组合页眉、页脚、数据长度和检查这四个标志可以显著提高数据传输的稳定性,但并非所有通信协议都包含上述四个标志,并且可能仅使用其中的一个或两个。 如果要发送的主要数据本身很长,添加这几个标志会更长。 对于传输速度慢、数据传输时间长、传输命令处理速度慢的设备来说,长命令可能会影响工作效率。 具体我就不多说了,今天主要讲一下接收数据的处理方法。 大家根据自己的协议选择合适的处理方法就可以了。

三、常用的几种数据处理方法

1、判定帧报头:串行端口接收到原始数据后,首先判定是否为帧报头,当帧报头正确时,丢弃帧报头并继续存储,反之,丢弃继续等。 代码示例如下所示。

usart _ get it status (usar t1,USART_IT_RXNE )!=reset; //接收中断{RES=usart_receivedata(usart1 ); //读取接收到的数据,同时也清除中断标志位USART_RX_BUF[USART_RX_STA ]=Res; if(usart_rx_buf[0]!=0xa5usart_rx_sta==1(//帧头错误USART_RX_STA=0; ///重新接收}if(usart_rx_sta=usart_rx_len )//接收完成USART_RX_STA=0; USART_RXHANDLE_FLAG=1; }这种处理方法可以有效地避免第一个字节的错误。 曾经尝试过在主设备端发送的数据的标头前增加1个字节(可能是传输开始后不久的电压不稳定产生的纹波),但该方法可以舍弃第一个错误的数据,从正确的标头接收但是,这种方法无法检查帧头后面的数据是否正确。

2、判断帧结束:所述帧结束可以被当作一个帧的数据,作为接收完成的标志。 此外,如果传入高速缓存中包含多个指令,帧尾将有助于在许多数据中区分哪些数据是相同的指令。 当然,也可以只是用于区分数据的头。 但是,这种方法必须保证帧的末尾与其他数据不同。 否则,就会有错误的判断。 所以,为了避免这个问题,有些人在帧的末尾使用2字节,这样会增加数据长度,影响通信效率。

3、根据数据长度判断接收是否完成:可以根据数据长度判断接收是否完成。 如果协议内的指令长度不统一,就不能根据固定长度接收数据。 此时,在一帧数据中加入数据长度这一标志,可以为单片机提供判据。 单片机接收到数据长度这个标志后,根据这个长度接收剩余的数据。 代码示例如下所示。

usart _ get it status (usar t1,USART_IT_RXNE )!=reset; //接收中断{RES=usart_receivedata(usart1 ); //读取接收到的数据,同时也清除中断标志位USART_RX_BUF[USART_RX_STA ]=Res; if(usart_rx_buf[0]!=0xa5usart_rx_sta==1(//帧头错误USART_RX_STA=0; //重新接收}if(usart_rx_sta==4) {USART_RX_Len=USART_RX_BUF[3]; //数据长度(if(usart_rx_sta=) usart_rx_len4) ) /接收已完成USART_RX_STA=0; USART_RXHANDLE_FLAG=1; ) 4、根据接收时间判断1帧数据的长度。 根据波特率计算2字节传输的时间间隔,接收数据后计时器开始计数,在计时器中断触发前接收数据后清空,重新计数,超过2字节的间隔时间后,认为1帧的数据接收完成。 虽然不写具体的步骤,但是在这个网上可以找到很多例行程序。 这个方法很合适

接收长度不定的情况,在这个方法的基础上还可以加上帧头帧尾等标志,增强稳定性。
5、校验处理:校验一般是在接收完成之后进行,校验是很必要的,因为它包含一帧数据的所有字节,通过校验能够大大的减少出错的概率。

四、总结
其实串口接收数据处理主要要注意两点,第一点是单片机如何确定一帧数据接收完成,第二点是单片机如果判断接收到的数据是正确的指令。第一点可以通过帧尾,数据长度等标志确定接收完成。第二点可以先通过帧头初步判断指令的正确性,再通过校验二次处理,判断指令是否正确接收。

关于串口接收数据处理的相关内容就介绍到这里,如果还有什么问题,可以留言,如果文章有哪里写的不对,欢迎指正,谢谢!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。