我会用HDLC。我过去在这方面运气很好。我想对于点对点串行只需使用异步成帧并忘记所有其他控制内容,因为它可能是矫枉过正的。
此外还使用 HDLC 来对数据包进行成帧。我将数据包格式化如下。这就是使用 802.11 传递选项的方式
U8 cmd;
U8 len;
u8 payload[len];
每个命令包的总大小为len+2
然后您定义命令,例如
#define TRIGGER_SENSOR 0x01
#define SENSOR_RESPONSE 0x02
另一个优点是您可以添加新命令,并且如果您正确设计解析器以忽略未定义的命令,那么您将具有一定的向后兼容性。
因此,将所有内容放在一起,数据包将如下所示。
// total packet length minus flags len+4
U8 sflag; //0x7e start of packet end of packet flag from HDLC
U8 cmd; //tells the other side what to do.
U8 len; // payload length
U8 payload[len]; // could be zero len
U16 crc;
U8 eflag; //end of frame flag
然后,系统将监视串行流中的标志 0x7e,当它出现时,您检查长度以查看它是否 pklen >= 4 且 pklen=len+4 以及 crc 是否有效。请注意,不要仅依赖 crc 来处理小数据包,在检查长度时您也会得到很多误报。如果长度或 crc 不匹配,只需重置长度和 crc 并开始解码新帧。如果匹配,则将数据包复制到新缓冲区并将其传递给命令处理函数。当收到标志时,总是重置长度和 crc。
对于命令处理函数,获取 cmd 和 len,然后使用开关来处理每种类型的命令。我还要求某些事件发送响应,以便系统的行为类似于事件驱动的远程过程调用。
例如,传感器设备可以具有计时器或响应命令来读取读数。然后它会格式化一个数据包并将其发送到 PC,PC 会响应它收到了该数据包。如果不是,则传感器设备可能会在超时时重新发送。
此外,当您进行网络传输时,您应该将其设计为网络堆栈,例如开放系统互连模型 as 福雷德克要点不要忘记物理层的东西。我在 HDLC 上的帖子是数据链路层和RPC 和命令处理是应用层.