您的位置 首页 产品

根据有限状态机的嵌入式体系串口通讯帧同步办法规划

基于有限状态机的嵌入式系统串口通信帧同步方法设计-串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中。中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态机的3种帧同步方法。通过测试、分析和比较得出,基于有限状态机的方法是

串口通讯是日前单片机DSP等嵌入式体系之间,以及嵌入式体系与PC机或无线模块之间的一种非常重要且遍及运用的通讯办法。在嵌入式体系的硬件结构中,一般只要一个8位或16位的CPU,不只要完结主流程的作业,一起还要处理随时发生的各种中止,因此嵌入式体系中的串口通讯程序规划与PC机有很大的不同。若嵌入式体系中。中止服务子程序在体系运转进程中占用了较多的时刻,就有可能在中止眼务子程序正运转时,又发生一个同类型或其他类型的中止,然后形成主程序得不到履行或后续中止数据丢掉。所以,嵌入式体系中的串口通讯尽管看似简略,但其间仍有许多问题值得研讨,例如串口通讯进程中的帧同步问题。本文针对该问题给出了逐次比较、依据FIFO行列和依据状态机的3种帧同步办法。经过测验、剖析和比较得出,依据有限状态机的办法是嵌入式体系串口通讯中很有用的帧同步办法,一起也是一种很不错的串口通讯程序规划结构。

1 串口通讯的数据帧结构

现代工业操控,往往需要由多个独立的操控模块来共同完结。它们之间经过串口通讯完结杂乱的操控进程,有必要在通讯进程中参加必要的通讯协议,以进步体系的可靠性和稳定性;而要完结特定的通讯协议,就得有必定的同步机制。下面介绍一下简化的串口通讯数据帧结构,以便剖析阐明嵌入式体系串口通讯进程中的帧同步办法。

假定串口发送的数据帧结构为:

其间:包头用于同步,一般是一个或多个ASCII字符,本文中假定数据帧同步头有2字节(0xAA、0x55);包长表明数据包中除掉包头和包长的字节数,一般用约定好的几个字节表明;类型为通讯协议里规则的指令类型;数据为应发送的首要信息;校验一般选用单字节“异或”的办法。

2 串口通讯中的帧同步办法

2.1 逐次比较的帧同步办法

首要等候串口数据,将接纳到的第1个字节数据与约定好的包头信息的第1个字节进行比较。假如不正确,则等候新字节,直到接纳的数据与包头信息的第1 个字节相同。第1个字节比较正确今后,将收到的第2个字节与包头信息的第2个字节进行比较。假如依然正确,则阐明串口接纳现已同步,能够开端接纳数据帧中的数据部分;不然,重新开端同步进程。其程序流程如图1所示。

依据有限状态机的嵌入式体系串口通讯帧同步办法规划

此种办法代码量小,编程简略,一般用于在主程序中以非中止办法接纳串口数据、实时性很差、数据帧较短的场合。可是,在串口速度过快且包头字节数比较多的情况下,串口完成同步花费的时刻很长或很难完成同步。例如,串口接纳到序列Ox0O OxAA0xAA 0x55…,当遇到第一个“0xAA”时,该办法以为第1个字节正确开端比较第2个同步头。第2个字节仍是“0xAA”而不是“0x55”,所以有必要等候新的字节重新开端比较第1个同步头。而紧随其后的是“0x55”,因此,此刻包头的第1个字节也没有同步上。事实上,“0x00 OxAA”是搅扰字节,“0xAA 0x55”才是通讯协议中的同步头。

2.2 依据FIFO行列的帧同步办法

依据同步包头的长度,界说一个相同长度的大局字节数组,把该数组看成是一个如图2所示的先入先出(FIFO)的行列。程序流程如图3所示。

依据有限状态机的嵌入式体系串口通讯帧同步办法规划

依据有限状态机的嵌入式体系串口通讯帧同步办法规划

本例中界说两个字节HEADl和HEAD2,都初始化为0xFF。同步时,丢掉数组头字节HEADl,数组中的一切数据向前移动一个字节,串口接纳到的新字节存入数组末字节HEAD2中,将整个数组与协议中的包头信息比较。假如正确,则置位已同步标志位,然后开端接纳、存储有用数据;不然,持续等候同步。串口数据接纳完后,不只要铲除已同步标志,还要把HEADl和HEAD2两个字节都赋值0xFF;不然,将会影响下一帧数据的同步和接纳。用前面说到的序列“0x00 0xAA 0xAA 0x55…”进行测验,跟着串口接纳中止收到新的字节。帧同步行列中的数据依次为: [0xFF,0xFF]→[0x00,0xFF]→[0xAA,0x00]→[0xAA,0xAA]→[0x55,0xAA]。此刻,该算法检测出 [HEAD2,HEAD2]==[0x55,0xAA],然后完成了同步,置位已同步标志位以便下次进入串口接纳中止服务子程序时开端接纳数据包的数据部分。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/99474.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部