一种基于状态机和环形队列的串口命令解析方法技术

技术编号:16474134 阅读:67 留言:0更新日期:2017-10-29 01:42
本发明专利技术涉及串口通讯技术领域,具体涉及一种基于状态机和环形队列的串口命令解析方法,包括如下步骤:S1:定义串口通信协议;S2:定义状态机的状态;S3:设置先进先出的环形循环数据缓冲区;S4:当上位机下发数据后,下位机采用DMA的方式将接收到的数据从外设读取到接收数组中,同时在程序主函数中不停地检测DMA是否接收到新的数据,当检测到新入的数据时则立即将新入的数据写入到环形数据缓冲区中;当环形数据缓冲区中有数据时,在程序的主函数中同时进行数据的读出,读出时依照状态机的状态进行数据的解析。本发明专利技术的基于状态机和环形队列的串口命令解析方法,能够提高系统的实时性。

A method of serial command analysis based on state machine and ring queue

The present invention relates to the technical field of serial communication, in particular to a serial order analytical method based on state machine and circular queue, which comprises the following steps: S1: definition of the serial communication protocol; S2: definition of state machine; S3: set the ring cycle data FIFO buffer; S4: when the host computer data after the machine adopts DMA mode to receive data from a peripheral read receiving array, while the main function of the program constantly check whether DMA receives new data, when the detected new data immediately into the new data is written to the data in the buffer when the ring; the data in the data buffer ring, in the main function in the program and data read, read in accordance with the state machine for data analysis. The method of serial command analysis based on the state machine and the ring queue can improve the real-time performance of the system.

【技术实现步骤摘要】
一种基于状态机和环形队列的串口命令解析方法
本专利技术涉及串口通讯
,具体涉及一种基于状态机和环形队列的串口命令解析方法。
技术介绍
目前在很多工程化应用控制中都采用了上位机和多台下位机构成的主从系统。下位机主要作为数据采集,驱动执行机构;上位机则通过对下位机进行集中管理,完成信息显示,数据运算并作出决策下发命令。上位机与下位机之间通过通讯的方式完成数据交互,在众多的通讯方式中,串口通讯应用比较普遍。传统的串口通讯的上位机和下位机的串口通讯过程中,上位机下发数据后,下位机通过串口中断,不仅要接收数据、进行数据的拷贝,还要进行帧头、帧长度、校验和、帧尾的判断。这样就会增大中断函数中程序的运算量和中断执行时间,因为在程序中中断函数的优先级要高于正常的函数,所以中断函数的运算量和执行时间增加不仅会影响其它函数的正常运行,并且还会因为中断函数中运算量和执行时间的增加甚至影响下一数据的接收,造成数据的丢失。这样的处理方式不仅冗余还缺乏稳定性和实时性。
技术实现思路
本专利技术的目的在于提供一种基于状态机和环形队列的串口命令解析方法,能够提高系统的实时性。为了实现上述目的,本专利技术采用如下技术方案:一种基于状态机和环形队列的串口命令解析方法,包括如下步骤:S1:定义串口通信协议;S2:定义状态机的状态;S3:设置先进先出的环形循环数据缓冲区;S4:当上位机下发数据后,下位机采用DMA的方式将接收到的数据从外设读取到接收数组中,同时在程序主函数中不停地检测DMA是否接收到新的数据,当检测到新入的数据时则立即将新入的数据写入到环形数据缓冲区中;当环形数据缓冲区中有数据时,在程序的主函数中同时进行数据的读出,读出时依照状态机的状态进行数据的解析。进一步地,所述步骤S1中,定义串口通信协议包含以下几个域:(1)帧头;(2)帧长度;(3)功能码;(4)帧数据体;(5)校验和。进一步地,所述数据帧头设置两个。进一步地,所述步骤S2中,定义状态机有以下几种状态:(1)数据帧头检查接收状态;(2)数据帧长检查接收状态;(3)功能码检查接收状态;(4)帧数据体接收状态;(5)数据帧校验和检查状态。进一步地,先进先出的环形循环数据缓冲区的设置方法为:设置一个大小为SIZE的线性数据缓冲区,用Tail指针指向该缓冲区中接收到的有效数据位置即写入数据的位置,用Head指针指向该缓冲区中已经处理的有效数据位置即读出的数据位置,初始化时,Head指针和Tail指针都指到0的位置;当串口接收到数据存放到缓冲区后,Tail就加1,当Tail大于SIZE-1时,将Tail更新为0;当系统从缓冲区取出一个数据进行分析,Head就加1,当Head大于SIZE-1时,将Head更新0。进一步地,按照下列步骤对读出的数据进行解析:S61:状态机的初始状态为数据帧头检查接收状态,依次对读出的数据进行帧头检查,若该数据与通信协议中预设的第一个帧头不相等则该数据无效,继续读取下一个数据,直到读取的两个数据与预设的两个帧头数据相等,此时帧头数据读取成功,更改状态机的状态为数据帧长检查接收状态;S62:继续读取下一个数据进行帧长度检查,如果该数据满足通信协议中对数据体长度的要求,则得到帧长度数据的同时更改状态机的状态为功能码检查接收状态;否则则表明该数据无效,更改状态机的状态为帧头检查接收状态,返回步骤S61;S63:继续读取下一个数据进行功能码检查,如果该数据满足通信协议中对功能码的要求,则更改状态机的状态为帧数据体接收状态;否则则表明该数据无效,更改状态机的状态为帧头检查接收状态,返回步骤S61;S64:根据步骤S2获得的帧长度数据,连续读取帧长度所要求的长度的数据作为帧数据体数据,然后更改状态机的状态为数据帧校验和检查状态,进入步骤S65;S65:对步骤S4获得的帧数据体进行校验和检查,若校验和正确则执行功能码规定的相应操作,否则则表明该数据无效,更改状态机的状态为帧头检查接收状态,返回步骤S61。进一步地,状态机在接收时,在字节与字节之间设置接收时间阈值,如果超过该时间阈值则该数据无效,返回步骤S61。本专利技术的基于状态机和环形队列的串口命令解析方法采用先进先出的循环环形缓冲区进行数据的存取,通过DMA的方式将数据由外设读取到数组,省去了串口中断过程中复杂的处理,提高了系统的实时性;在主循环中的依据状态机的状态实时进行数据队列中的指令识别及组包,把一条指令中的不同域存入结构体单元中,不存在因为单条命令的过长或者提取指令而导致此次循环的阻塞时间过长。同时加入了软件超时处理,对于错误的帧命令及时的筛选和丢弃,保证命令的正确性,防止因为命令的误判断导致安全事故。附图说明图1为本专利技术的主程序流程图;图2为先进先出循环环形缓冲区示意图;图3为状态机工作流程图。具体实施方式为了使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图和实施例,对本专利技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本专利技术,并不用于限定本专利技术。本专利技术的一种基于状态机和环形队列的串口命令解析方法,具体步骤如下:步骤一:定义串口通信协议;定义串口通信协议包含以下几个域:(1)帧头;(2)帧长度;(3)功能码;(4)帧数据体;(5)校验和。步骤二:定义状态机的状态;定义状态机有以下几种状态:(1)数据帧头检查接收状态;(2)数据帧长检查接收状态;(3)功能码检查接收状态;(4)帧数据体接收状态;(5)数据帧校验和检查状态。在本专利技术中,在程序主循环中不停地依据状态机的状态对环形队列中即将读出的数据进行指令识别和组包的操作。状态机有以下几种状态:(1)数据帧头检查接收状态E_UART_CMD_RECEIVING_HEADERE_UART_CMD_RECEIVING_HEADER状态作为数据帧头检查接收状态主要是判断数据的起始位,为了避免出错本协议定义了数据帧头为两个,共两字节。(2)数据帧长检查接收状态E_UART_CMD_DATA_LENGTHE_UART_CMD_DATA_LENGTH状态作为数据帧长检查接收状态主要是对帧长度是否满足要求进行检查,本协议定义了帧长度数据为单字节。(3)功能码检查接收状态E_UART_CMD_RECEIVING_CMDE_UART_CMD_RECEIVING_CMD状态作为功能码检查接收状态主要检查功能码是否在定义的功能码范围内,本协议定义功能码长度数据为单字节。(4)帧数据体接收状态E_UART_CMD_RECEIVING_BODYE_UART_CMD_RECEIVING_BODY状态作为帧数据体接收状态主要是依据帧长度接收帧数据体。(5)数据帧校验和检查状态E_UART_CMD_RECEIVING_VALIDE_UART_CMD_RECEIVING_VALID状态作为数据帧校验和检查状态主要是对接收到的数据进行CRC计算并校验。步骤三:设置先进先出的环形循环数据缓冲区;本专利技术采用环形循环数据缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区。在主循环中环形缓冲区有写入和读出两个动作,当DMA中有新数据时进行写入操作,而当有数据未读出时则进行读出操作。数据缓冲区有一个读指针和一个写指针。读指针指向数据缓冲区中本文档来自技高网...
一种基于状态机和环形队列的串口命令解析方法

【技术保护点】
一种基于状态机和环形队列的串口命令解析方法,其特征在于,包括如下步骤:S1:定义串口通信协议;S2:定义状态机的状态;S3:设置先进先出的环形循环数据缓冲区;S4:当上位机下发数据后,下位机采用DMA的方式将接收到的数据从外设读取到接收数组中,同时在程序主函数中不停地检测DMA是否接收到新的数据,当检测到新入的数据时则立即将新入的数据写入到环形数据缓冲区中;当环形数据缓冲区中有数据时,在程序的主函数中同时进行数据的读出,读出时依照状态机的状态进行数据的解析。

【技术特征摘要】
1.一种基于状态机和环形队列的串口命令解析方法,其特征在于,包括如下步骤:S1:定义串口通信协议;S2:定义状态机的状态;S3:设置先进先出的环形循环数据缓冲区;S4:当上位机下发数据后,下位机采用DMA的方式将接收到的数据从外设读取到接收数组中,同时在程序主函数中不停地检测DMA是否接收到新的数据,当检测到新入的数据时则立即将新入的数据写入到环形数据缓冲区中;当环形数据缓冲区中有数据时,在程序的主函数中同时进行数据的读出,读出时依照状态机的状态进行数据的解析。2.根据权利要求1所述的基于状态机和环形队列的串口命令解析方法,其特征在于,所述步骤S1中,定义串口通信协议包含以下几个域:(1)帧头;(2)帧长度;(3)功能码;(4)帧数据体;(5)校验和。3.根据权利要求2所述的基于状态机和环形队列的串口命令解析方法,其特征在于,所述数据帧头设置两个。4.根据权利要求3所述的基于状态机和环形队列的串口命令解析方法,其特征在于,所述步骤S2中,定义状态机有以下几种状态:(1)数据帧头检查接收状态;(2)数据帧长检查接收状态;(3)功能码检查接收状态;(4)帧数据体接收状态;(5)数据帧校验和检查状态。5.根据权利要求1或2或3或4所述的基于状态机和环形队列的串口命令解析方法,其特征在于,先进先出的环形循环数据缓冲区的设置方法为:设置一个大小为SIZE的线性数据缓冲区,用Tail指针指向该缓冲区中接收到的有效数据位置即写入数据的位置,用Head指针指向该缓冲区中已经处理的有效数据位置即读出的数据位置,初始化时,Head指针和Tail指针都指到0的位置;当串口接收到数据存放到缓冲区后,Tail就加1,当...

【专利技术属性】
技术研发人员:王在义王启叶韩大伟
申请(专利权)人:青岛华潞佳电子科技有限公司
类型:发明
国别省市:山东,37

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1