background image

此种方法代码量小,编程简单,

一般用于在主程序中以非中断方式
接收串口数据、实时性很差、数据帧
较短的场合。但是,在串口速度过
快且包头字节数比较多的情况下,
串口实现同步花费的时间很长或很
难实现同步。例如,串口接收到序

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],从而实现了同步,置位已同步标志位以便

下次进入串口接收中断服务子程序时开始接收数据包的数据部分。

此种方法与逐次比较的帧同步方法相比,能够比较快速、正确地检测出同步包头;但是