由于异步串行通信甚至在当今的电子设备中也很普遍,我相信我们许多人会不时遇到这样的问题。考虑与串行线(RS-232或类似产品)连接并且需要连续交换信息的电子设备D
和计算机。即每个发送一个命令帧,并每个发送一个状态报告/遥测帧答复(报告可以作为对请求的响应发送,也可以独立发送-在这里并不重要)。通信帧可以包含任何任意二进制数据。假设通信帧是固定长度的分组。PC
PC
X ms
D
Y ms
问题:
由于协议是连续的,因此接收方可能会失去同步,或者只是在进行中的发送帧中间“加入”,因此它只是不知道帧起始位置(SOF)在哪里。根据数据相对于SOF的位置,数据具有不同的含义,接收到的数据可能会永久损坏。
所需的解决方案
可靠的定界/同步方案可在恢复时间短的情况下检测SOF(即重新同步所需的时间不超过1帧)。
我了解(并使用了一些)的现有技术:
1)标头/校验和 -SOF作为预定义的字节值。帧末的校验和。
- 优点:简单。
- 缺点:不可靠。恢复时间未知。
2)字节填充:
- 优点:可靠,快速恢复,可与任何硬件一起使用
- 缺点:不适用于固定大小的基于帧的通信
3)第9位标记 -在每个字节之前附加一个位,而SOF标记为1
和数据字节标记为0
:
- 优点:可靠,快速恢复
- 缺点:需要硬件支持。大多数
PC
硬件和软件未直接支持。
4)第8位标记 -上面的一种模拟,同时使用第8位而不是第9位,每个数据字仅保留7位。
- 优点:可靠,快速的恢复,可与任何硬件一起使用。
- 缺点:需要从/到常规8位表示到/从7位表示的编码/解码方案。有点浪费。
5)基于超时 -假定SOF为某个已定义的空闲时间之后的第一个字节。
- 优点:无数据开销,简单。
- 缺点:不太可靠。在较差的计时系统(如Windows PC)上无法很好地工作。潜在的吞吐量开销。
问题: 还有哪些其他可能的技术/解决方案可以解决该问题?您能否指出上面列出的缺点,可以轻松解决这些缺点,从而消除它们?您(或您将)如何设计系统协议?