一种串口通讯数据处理分析方法

文档序号:8445372阅读:575来源:国知局
一种串口通讯数据处理分析方法
【技术领域】
[0001 ] 本发明涉及一种新型的串口通讯数据处理分析方法,属于数据传输技术领域。
【背景技术】
[0002] 在目前很多的工程化控制应用中,大部分采用了PC机和多台单片机构成的主从 系统;单片机主要进行数据采集,处理现场信号,驱动执行机构;PC机则通过对单片机进行 集中管理,完成信息显示,数据运算并做出决策以分配任务。PC机与单片机之间则需通过通 讯方式完成数据交互,在众多通讯接口中,串口通讯应用比较普遍。
[0003] 串口通讯有RS232、RS422和RS485三种方式,按照字节流的方式来进行,即每中断 一次,表明成功传送或者接收一个字节;但是,由于RS232、RS422和RS485等串口通讯存在 不可靠、不稳定的问题,因此需要提供一种新的串口通讯数据处理方法。

【发明内容】

[0004] 有鉴于此,本发明的目的是针对现有技术的不足,提出一种新型的串口通讯数据 处理分析方法,该方法可以有效提高串口通讯的稳定性。
[0005] 实现本发明的技术方案如下:
[0006] 一种串口通讯数据处理分析方法,数据存储时,将通讯数据存储于大小为SIZE的 循环先进先出环形缓冲区中,缓冲区中Tail指针表示该缓冲区中接收到的有效数据位置, Head指针表示该缓冲区中已经处理的有效数据位置,HeadBak指针为Head指针的备份;数 据写入时,首先判断缓冲区是否写满,若Tail不等于Head,则表示缓冲区不满,写入数据; 否则,不能写入;
[0007] 数据读出处理分析时采用如下步骤进行:
[0008] 步骤一、读取缓冲区数据进行前导码检查,若该数据与通信协议中预设的前导码 不相等,则表明该数据不是前导码,丢弃该数据,读取下一个数据继续进行前导码检查,直 到读取数据与预设的前导码相等,即获得前导码,转入步骤二;
[0009] 步骤二、读取缓冲区中下一个数据进行帧长度检查,若该数据不满足通信协议中 对长度域可能出现的最大和最小包长要求,则表明该数据不是帧长度,丢弃该数据,读取下 一个数据继续进行帧长度检查,直到读取数据满足通信协议要求,即获得帧长度,转入步骤 -* ? -?,
[0010] 步骤三、读取缓冲区中下一个数据进行帧号检查,若该数据与通信协议中预设的 帧号不相等,则表明该数据不是帧号,丢弃该数据,读取下一个数据继续进行帧号检查,直 到读取数据与预设的帧号相等,即获得帧号,并令HeadBak等于Head,转入步骤四;
[0011] 步骤四、根据步骤二获得的帧长度数据,连续读取帧长度所述长度的数据作为数 据域数据,转入步骤五;
[0012] 步骤五,按照通信协议对步骤四获得的数据域数据进行校验和检查,若校验和错 误,则表明读取的数据域中有数据有误,放弃此次读取的数据域数据,令Head=HeadBak, 转入步骤一,即从HeadBak所示位置开始重新执行步骤一~步骤五,进行数据读取分析;若 校验和正确,则读取(Head-HeadBak+SIZE) %SIZE的长度数据,然后根据帧号,执行相应的 操作。
[0013] 有益效果
[0014] (1)本发明采用循环先进先出环形缓冲区进行数据存储,能够利用循环FIFO缓冲 区的特性,提供对数据的缓存和对字节流数据灵活多样的访问方式;在读取数据时,分别依 次对协议的各个域(前导码、帧长度、帧号、数据域、校验和)进行严格的检查,实现对部分 含有错误域的包和不完整的包的完美过滤,以及对混乱数据中正确包准确无误的抽取,减 少数据帧(即报文)读取时由于数据错误提取带来的对报文的错误解读。
[0015] ⑵采用HeadBak对Head进行备份,当帧头分析结束后(即提取完帧号后),记录 下Head的位置,以防后续数据不符合协议要求后,根据HeadBak重新恢复Head的位置,从 而防止前导码等信息漏查。
【附图说明】
[0016] 图1为通讯协议结构。
[0017] 图2为循环FIFO缓冲区示意。
[0018] 图3为本发明流程图。
【具体实施方式】
[0019] 下面结合具体实例对本发明作进一步详细说明。
[0020] 本发明一种新型的串口通讯数据处理分析方法,具体过程为:
[0021] (一)定义通讯协议
[0022] 串口通讯协议一般包含这样几个域:帧头、用户数据和帧尾,其中,帧头包括前导 码、帧长度和帧号;用户数据对应数据域;帧尾为校验和。
[0023] (二)循环FIFO(先进先出)环形缓冲区
[0024] 本发明采用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲 区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。环形缓冲区 有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲 区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通 常情况下,环形缓冲区的读数据仅仅会影响读指针,而写数据仅仅会影响写指针。
[0025] 采用具有先进先出功能的循环FIFO环形缓冲区进行串口数据接收和发送,如图2 所示。
[0026] 从图2中可以看出,先进先出功能的FIFO缓冲区须定义一个大小为SIZE的缓 冲区,存放数据,Tail指针表示该缓冲区中接收到的有效数据位置,表示写入的数据位 置;Head指针表示该缓冲区中已经处理的有效数据位置,表示读出的数据位置;初始化时, Head指针和Tail指针都指到0的位置;当串口接收到数据存放到缓冲区后,Tail就加1, 当Tail大于SIZE-I时,将Tail更新为0,数据接收时,线性缓冲区变成一个回环;当系统从 缓冲区取出一个数据进行分析,Head就加1,当Head大于SIZE-I时,将Head更新0,数据 分析时,线性缓冲区也变成一个回环;依据这种方法,可以看出,数据先到的,数据先分析, 建立了先进先出功能的FIFO循环缓冲区。
[0027] 这个结构体很简单,Tail表示写入的数据位置,Head表示读出的数据位置。在对 Head和Tail修改时,需要对SIZE取模,防止溢出。SIZE-般根据串口采用的波特率、数据 流量和计算机的处理速度来决定大小。
[0028] (三)缓冲区数据的操作
[0029] 根据FIFO的方式实现缓冲区的初始化、写入和读出的操作时,需要注意以下几 占.
[0030] 1)缓冲区的有效数据长度
[0031] 缓冲区的有效数据长度表示在缓冲区中存在的没有及时处理的数据长度;可以这 样计算:(Tail+SIZE-Head) %SIZEo
[0032] 2)缓冲区的可以写入数据长度
[0033] 缓冲区的可以写入数据长度表示在当前缓冲区中还能写入的数据长度;可以这样 计算:SIZE-(
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1