【发布时间】:2010-06-23 18:20:31
【问题描述】:
我正在研究嵌入式设备之间的通信协议。该协议将来肯定需要新的命令和字段。我需要做些什么来确保我不会把自己画到角落里?
【问题讨论】:
我正在研究嵌入式设备之间的通信协议。该协议将来肯定需要新的命令和字段。我需要做些什么来确保我不会把自己画到角落里?
【问题讨论】:
这是一个悬而未决的问题。以下是一些关于它的随机想法:
总之,留下备用。
【讨论】:
如果可能的话,让电缆一端的人弄清楚电缆的另一端是什么。 理想情况下,一个人可以连接一个哑终端并按三下键盘(Enter Question-mark Enter),然后会返回一条长而详细的消息,描述它是什么类型的机器,它的型号是什么,名称和构建它的组织的电话号码和网站、“官方”协议版本号和非官方构建时间:
__DATE__ ": " __TIME__
每次机器启动时也发送相同的详细消息。
如果可能,请尝试设计您的协议,以便拥有哑终端的人可以与您的设备交谈。 HTTP 就是这样一种人类可读的协议,我怀疑这是它受欢迎的原因之一。 除其他外,人类可读意味着:
您可能还想浏览common protocols for embedded systems 的列表。 也许一个已经满足您的要求? 有什么理由使用比标准Netstring format 更难解码的东西吗?
【讨论】:
这个问题有点过于笼统,无法给出明确的答案。嵌入式系统可能需要在很多方面进行通信;
它需要与多少对等方进行通信? 它需要通信多少数据? 系统需要多紧密同步? 协议的物理介质是什么,带宽限制和易错性考虑因素是什么?
所有这些要求和资源限制肯定会限制系统,然后您就可以开始弄清楚协议需要什么。一旦你知道了这些问题,你就可以预测未来一些需求可能会如何变化/扩展。从那里您可以设计协议以适应(或不适应)最坏情况的用例。
【讨论】:
我会使用HDLC。过去我很幸运。对于点对点串行,我只使用Asynchronous framing 并忘记所有其他控制内容,因为它可能会矫枉过正。
除了使用 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 将响应它收到数据包。如果不是,则传感器设备可以在超时时重新发送。
此外,当您进行网络传输时,您应该将其设计为像OSI modle 这样的网络堆栈。 HDLC 是data link layer 和RPC and command handling is the Application Layer。
【讨论】: