引言 串口通信是日前单片机和 DSP 等嵌入式系统之间, 以及嵌入式系统与 PC 机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中, 一般只有一个 8 位或 16 位的 CPU, 不但要完成主流程的工作, 同时还要处理随时发生的各种中断, 因而嵌入式系统中的串口通信程序设计与 PC 机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间, 就有可能在中断眼务子程序正运行时, 又产生一个同类型或其它类型的中断, 从而造成主程序得不到执行或后续中断数据丢失。因此, 嵌入式系统中的串口通信虽然看似简单, 但其中仍有许多问题值得讨论, 例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、 基于 FIFO 队列和基于状态机的 3 种帧同步方法。经过测试、 分析和比较得出, 基于有限状态机的方法是嵌入式系统串口通信中很有效的帧同步方法, 同时也是一种很不错的串口通信程序设计结构。 1 串口通信的数据帧结构 现代工业控制, 往往需要由多个独立的控制模块来共同完成。它们之间经过串口通信完成复杂的控制过程, 必须在通信过程中加入必要的通信协议, 以提高系统的可靠性和稳定性; 而要完成特定的通信协议, 就得有一定的同步机制。下面介绍一下简化的串口通信数据帧结构, 以便分析说明嵌入式系统串口通信过程中的帧同步方法。 假定串口发送的数据帧结构为: 其中: 包头用于同步, 一般是一个或多个 ASCII 字符, 本文中假定数据帧同步头有 2 字节(0xAA、 0x55); 包长表示数据包中除去包头和包长的字节数, 一般用约定好的几个字节表示; 类型为通信协议里规定的命令类型; 数据为应发送的主要信息; 校验一般采纳单字节”异或的方法。 2 串口通信中的帧同步方法 2.1 逐次比较的帧同步方法 首先等待串口数据, 将接收到的第 1 个字节数据与约定好的包头信息的第 1个字节进行比较。假如不正确, 则等待新字节, 直到接收的数据与包头信息的第 1 个字节相同。第 1 个字节比较正确以后, 将收到的第 2 个字节与包头信息的第 2 个字节进行比较。假如依旧正确, 则说明串口接收已经同步, 能够开始接收数据帧中的数据部分; 否则, 重新开始同步过程。其程序流程如图 1 所示。 此种方法代码量小, 编程简单, 一般用于在主程序中以非中断方式接收串口数据、 实时性很差、 数据帧较短的场合。可是, 在串口速度过快且包头字节数...