单片机串口接收的几种常用的数据处理方法

一、为什么串口接收的数据需要处理
我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因为单片机串口受到别的信号干扰的时候,容易出现数据错误,特别是串口发送的第一个字节和最后一个字节。一旦出现这种情况,设备之间的通讯可能会受到影响,甚至会导致系统瘫痪。另外,串口收到数据的时候,我们也需要判断一帧数据的长度,特别是指令发送比较频繁的时候。因此,串口在接收到数据之后应该先进行数据处理,再执行命令,这样能够增强产品的稳定性。

二、串口接收重点关注的几个标志
为了保证通讯的稳定性,一般的通讯协议会加入帧头、帧尾、数据长度、校验这四个标志中的一个或多个。它们的作用如下:
1、帧头:串口发送数据的第一个字节是最容易出错的,如果你把重要的指令放在第一个字节,一旦出现错误,可能会使从机执行错误的操作。而帧头能够有效规避这个问题。
2、帧尾:和帧头类似,帧尾也能避免最后一个字节出错,同时,它也可以作为接收端接收完成的标志。
3、数据长度:它可以作为接收端接收完成的标志。有时也能作为判断数据是否正确的标志。
4、校验:能够有效避免校验以外的所有数据的错误,但是校验正确不代表数据一定没有出错,每种校验方式都有一定的缺陷。
帧头、帧尾、数据长度和校验,这四种标志加起来之后能够大大的增强数据传输的稳定性,但不是每个通讯协议都会包含以上四个标志,可能只会用到其中的一两个。因为如果要发送的主要数据本身就比较长,加上这个几个标志之后会更长,这对于那种传输速度慢、传输数据时间长、传输指令频繁处理速度慢的设备来说,较长的指令可能会影响工作效率。具体我就不多说了,我今天主要讲的是接收数据的处理方法,大家根据自己的协议选择合适的处理方法就行了。

三、常用的几种数据处理方法
1、判断帧头:串口接收到第一个数据之后先判断是否是帧头,如果帧头正确就存起来继续收,反之则丢掉继续等帧头。示例代码片段如下:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
{Res = USART_ReceiveData(USART1);//读取接收到的数据,同时也清除了中断标志位USART_RX_BUF[USART_RX_STA ++] = Res;if(USART_RX_BUF[0] != 0xA5 && USART_RX_STA == 1){//帧头错误USART_RX_STA = 0;//重新接收}if(USART_RX_STA >= USART_RX_Len){//接收完成USART_RX_STA = 0;USART_RXHANDLE_FLAG = 1;}
}

这种处理方法能够有效避免第一个字节出错的问题,我就试过一次主设备那边传过来的数据帧头前面多了一个字节(可能是刚开始传输的时候电压不稳定产生的纹波),用这种方法就能够之间把第一个错误的数据丢掉,从正确的帧头开始接收。但是这种方法不能够检查帧头后面的数据是否正确。
2、判断帧尾:可以把帧尾作为一帧数据接收完成的标志。另外,当接收缓存存了多个指令的时候,帧尾能够帮助我们在一堆数据中区分出哪些数据是同一个指令的。当然,如果仅仅是区分数据用帧头也可以。不过这种办法必须保证帧尾和其他数据不一样,不然就会出现错误的判断。所以有些人为了避免这个问题会用两个字节作为帧尾,不过这样一来,数据长度就更大了,影响通讯效率。
3、根据数据长度判断是否完成接收:可以通过数据长度判断接收是否完成。如果协议里面的指令长度不是统一的,我们就不能根据固定的长度来接收数据。这个时候在一帧数据里面加入数据长度这个标志,就能够给单片机一个判断的准则,单片机接收到数据长度这个标志之后,根据这个长度来接收剩下的数据。示例代码片段如下:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
{Res = USART_ReceiveData(USART1);//读取接收到的数据,同时也清除了中断标志位USART_RX_BUF[USART_RX_STA ++] = Res;if(USART_RX_BUF[0] != 0xA5 && USART_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_Len + 4)){//接收完成USART_RX_STA = 0;USART_RXHANDLE_FLAG = 1;}
}

4、根据接收时间判断一帧数据的长度。根据波特率计算出两个字节传输的时间间隔,接收到数据之后定时器开始计时,在定时器中断触发之前收到数据就清空,重新计时,超过两个字节的间隔时间,就认为是一帧数据接收完成。具体的程序我就不写了,这个网上能找到很多例程。这种方法适合接收长度不定的情况,在这个方法的基础上还可以加上帧头帧尾等标志,增强稳定性。
5、校验处理:校验一般是在接收完成之后进行,校验是很必要的,因为它包含一帧数据的所有字节,通过校验能够大大的减少出错的概率。

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

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

单片机串口接收的几种常用的数据处理方法相关推荐

  1. 单片机串口接收数据的一些经验与教训

    一些好文章 一种单片机数据解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw 单片机串口接收数据需要注意以下几点 1.接收数据要有顺序,接收到 ...

  2. stc51单片机串口接收多字节数据

    stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include &quo ...

  3. 五种常用异常值检测方法

    Toggle navigation 首页 产业趋势 专家观察 CISO洞察 决策研究 登录 APP下载 数据挖掘最前线:五种常用异常值检测方法 安全运营 机器之心 2019-07-05 通过鉴别故障来 ...

  4. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  5. 异常数据4种剔除方法_数据分析系列 22/32 | 9种常用的数据分析方法

    要使各种结构化的.非结构化的.海量的数据实现标准化.信息化,能够提供业务绩效评估.业务决策支持等要求,我们首先需要进行数据分析. 同时,围绕业务问题,采用合适的分析方法,分析模型,以及分析工具,这是数 ...

  6. python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  7. 几种常用的优化方法梯度下降法、牛顿法、)

                                                                       几种常用的优化方法 1. 前言 熟悉机器学习的童鞋都知道,优化方法 ...

  8. (转)几种常用存储过程分页方法

    我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableNam ...

  9. 功能测试常用6种方法_16种常用的数据分析方法聚类分析

    聚类(Clustering)就是一种寻找数据之间内在结构的技术.聚类把全体数据实例组织成一些相似组,而这些相似组被称作簇.处于相同簇中的数据实例彼此相同,处于不同簇中的实例彼此不同. 聚类分析定义 聚 ...

最新文章

  1. spring中的ReflectionUtil
  2. 怎样在SecureCRT的shell里用命令上传下载文件(转)
  3. sql 2005学习笔记1
  4. MySQL数据库的常用操作
  5. echarts控制只显示部分数据的折线图_Python数据可视化之pyecharts入门
  6. Echarts实现环形图的渐变颜色效果
  7. spring AOP解说
  8. linux安装redis插件,Linux平台安装redis及redis扩展的方法
  9. 【z】多线程Java Socket编程示例
  10. c++获取一段代码的执行时间_微软IE浏览器JScript脚本引擎远程代码执行漏洞通告...
  11. 二级Access数据库大纲知识要点
  12. cmd换行 windows_键盘键位修改及管理(Windows篇)
  13. 夜间灯光数据dn值_NPPVIIRS年度夜间灯光数据的合成方法与验证
  14. 前端ES6+基础总结
  15. fc安卓模拟器_安卓电视卡丑慢!装上它们,像iOS一样省心易用
  16. 多因素deseq2 formula 怎么理解 如何设置design 哈佛大学——差异表达分析(七)设计公式(Design formulas)多因素差异分析 多个影响因子会影响差异分析结果 多因子
  17. 实验三|Python 企业营运能力分析
  18. 用可视化解构BERT,我们从上亿参数中提取出了6种直观模式
  19. 教师计算机技能培训方案,教师计算机技能培训方案
  20. mac m1 homebrew安装

热门文章

  1. SQl语句之 BETWEEN 用法
  2. 初探云原生下的AI应用文件系统-JuiceFS
  3. 安装系统出现No CD-ROM drive to use:GCDROM not load
  4. Android DrawableTint使用
  5. pycharm、webstorm 命令行 Smart commands execution Highlighted commands can be interpreted and executed
  6. u盘被分区了怎么还原?
  7. latex设置itemize形式以及多层itemize
  8. java setmaxfilesize,Java ServletFileUpload.setFileSizeMax方法代碼示例
  9. 【乐绘派】Audition专业音频后期制作教程 | 5-自定义工作区
  10. c#中的string和StringBuilder的区别