嵌入式系统中串口通信帧的同步方法

发布者:sclibin最新更新时间:2007-10-15 来源: 单片机及嵌入式系统应用关键字:比较  接收  同步  程序 手机看文章 扫描二维码
随时随地手机看文章
引 言

串口通信是日前单片机和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],从而实现了同步,置位已同步标志位以便下次进入串口接收中断服务子程序时开始接收数据包的数据部分。

此种方法与逐次比较的帧同步方法相比,能够比较快速、正确地检测出同步包头;但是如果包头的字节数很多,同步过程中每次进入串口中断服务子程序都要进行大量的字节搬移,将必然耗费很长的时间。为了使嵌入式系统更健壮,程序设计应把握的基本原则之一就是使中断处理程序最短。所以基于FIFO队列的帧同步方法也不是最优的。

2.3 基于有限状态机的帧同步方法

为解决以上问题,可以采用基于有限状态机的设计方法。该方法将数据帧的接收过程分为若干个状态:接收信息头HEADl状态、接收信息头HEAD2状态、接收包长状态、接收数据类型状态、接收数据状态及接收校验和状态。系统的初始状态为HEADl状态,各接收状态间的状态转移图如图4所示,仍用前面提到的序列“0x00 0xAA 0xAA 0x55…”进行测试。随着串口接收中断新字节的接收,系统的接收状态依次为HEAD1→HEAD1→HEAD2→HEAD2→LEN。可见此时就是同步状态。该方法也快速、有效地实现了同步;但是需要注意的是,在每一次接收完1帧完整的数据之后,必须把系统的接收状态重新设置为HEADl,否则将会影响下一帧的数据接收。

此后,程序按照协议开始依次接收数据帧长度、命令类型、数据和校验位。接收完后,重新设置系统接收状态为HEADl,同时对该数据帧进行校验。校验正确后,利用消息机制通知主程序根据命令类型对数据帧进行处理或执行相应的命令操作。

下面给出该方法在KeilC5l中的示例程序:

由于采用了状态机和消息机制的结构,上述设计思路快速有效地实现了串口通信的同步,而且程序结构清晰,便于维护,也易于向其他的串口通信协议移植。另外,串口中断服务子程序中需要处理的工作很少,每个串口接收中断平均耗时不超过20个机器周期(在单片机AT89C5l中),大大减轻了串口接收中断服务程序的压力,缓解了嵌入式系统有限资源与需求之问的矛盾,提高了嵌入式系统的稳定性。

3 结论

从上面的分析和测试可以看出,基于有限状态机的串口通信帧同步方法是本文中提出的3种帧方法中最优的,结构清晰且系统资源利用率高。

对一个有着完整通信协议的串口中断来说,因为要比较命令头、完成校验、解析数据等需要耗费大量的机器周期,所以嵌入式系统中的串口中断服务程序设计显得更为重要。在实际的串口通信程序中,可采用状态机和消息机制相结合的方法,仅在中断服务程序中设置一个标志,而在主程序中根据相应标志来作处理,这样就回避了某些中断可能需要较长处理时间的问题。在程序结构上,由于采用状态机的结构,既提高了可读性。同时又提高了运行速度,因而该方法不仅是一种很好的帧同步方法,还是一种很不错的串口通信程序设计方法。

关键字:比较  接收  同步  程序 引用地址:嵌入式系统中串口通信帧的同步方法

上一篇:高速嵌入式视频系统中SDRAM时序控制分析
下一篇:8位机嵌入式TCP通信速度的研究

推荐阅读最新更新时间:2024-05-02 20:38

电动汽车的四种驱动电机比较
新能源 汽车具有环保、节约、简单三大优势。在纯  电动汽车 上体现尤为明显:以  电动机 代替燃油机,由 电机驱动而无需自动变速箱。相对于自动变速箱,电机结构简单、技术成熟、运行可靠,甚至被视为中国在新能源汽车行业实现汽车工业“弯道超车”的希望领域之一。新能源电动汽车主要是由电机驱动系统、电池系统和整车控制系统三部分构成,其中的电机驱动系统是直接将电能转换为机械能的部分,决定了电动汽车的性能指标。因此,对于 驱动电机的选择就尤为重要。 电动汽车的驱动电机要求有以下几个特点: 宽广的恒功率范围,满足汽车的变速性能 启动扭矩大,调速能力强 效率高,高效区广 瞬时功率大,过载能力强 功率密度大,体积小,重量轻
[嵌入式]
数字温度传感器DS18B20程序
   ORG  0000H START: MOV  SP,#60H     ;开机初始化     MOV  P0,#0FFH     MOV  P1,#0FEH     MOV  P2,#0FFH     MOV  P3,#0FFH MAIN:  LCALL  GET_TEMPER   ;调用读温度子程序     LCALL  DISP      ;调用 数码管 显示子程序     AJMP  MAIN      ;重复循环 ;------ 读DS18B20传感器的温度值 ------ GET_TEMPER:     SETB  P3.3     LCALL  RST18B20    ;复位DS18B20
[单片机]
51单片机键盘接口电路(含源程序)
键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。 按钮开关的抖动问题 组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开 键盘结构图 图1 图2 关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则
[单片机]
51单片机键盘接口电路(含源<font color='red'>程序</font>)
单总线驱动程序(DS18B20)
sbit DQ=P3^7; //DS18B20数据传输线接单片机的相应的引脚 void delaymm(uint z) { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } //向DS18B20读一字节数据 ,从低位开始读 ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i 0;i--) { DQ=1; delay(1); DQ=0;
[单片机]
同步调相机和电池储能形成了支持电网的强大组合
  同步调相机(Synchronous condenser,SC)技术和电池储能系统(BESS)在混合配置中相互补充。这提供了一系列电网支持功能,包括黑启动功能。ABB同步调相机专家Christian Payerl解释道。   系统惯性的下降给全球电网带来了重大挑战。它是传统的大型集中式发电厂退役的结果,这些发电厂主要基于旋转同步发电机。电力需求的增加,以及风能和太阳能等可再生资源逆变器发电的普及,正在加速这种下降。   众所周知,系统惯性的降低会导致
[新能源]
msp430G2553时钟选择与分频程序
msp430G2553单片机的时钟选择和分频程序如下: #include "msp430G2553.h" #define unchar unsigned char #define uint unsigned int uint Fre; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; BCSCTL2 |=SELM_1+DIVM_0; P1DIR &=~BIT3; P1REN |=BIT3; P1OUT |=BIT3; P1DIR |=BIT0; P1IE |=BIT3;
[单片机]
基于Linux的温度传感器DS18B20驱动程序设计
  引言   传统的模拟温度测量抗干扰能力差,放大电路零点漂移大,导致测量值误差大,难以达到所需精度。在实际应用中,采用抗干扰能力强的数字温度传感器是解决上述问题的有效办法。   DS18B20是Dallas公司生产的数字温度传感器,具有体积小、适用电压宽、经济灵活的特点。它内部使用了onboard专利技术,全部传感元件及转换电路集成在一个形如三极管的集成电路内。DS18B20有电源线、地线及数据线3根引脚线,工作电压范围为3~5.5 V,支持单总线接口。   准确的温度测量是很多嵌入式系统中重要的一点。在Linux操作系统下使用数字温度传感器DS18B20,不仅可以得到高精度的温度测量值,而且硬件简单可靠。   1Linu
[单片机]
基于Linux的温度传感器DS18B20驱动<font color='red'>程序</font>设计
S3C6410开发(3)-编译运行第一个流水灯程序
编写程序 由于我们是在纯裸机上编程,没有uboot之类的程序为我们初始化硬件资源,所以我们要编写一个带有初始化功能的汇编文件。同时为了直观地感受到程序的运行,我们在里面添加一个流水灯的小程序。在工作目录新建一个 statup.s 的文件,编写初始化程序并根据电路板原理图配置LED的GPIO的模式和输出电平。 .global _start _start: // 把外设的基地址告诉CPU ldr r0, =0x70000000 // 对于6410来说内存(0x00000000~0x60000000) // 外设(0x70000000-0x7fffffff) orr r0, r0, #0
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved