设计一个串行命令和数据协议

5
我需要(设计?)一种协议,用于微处理器驱动的数据记录仪和PC(或类似设备)之间通过串行连接进行通信。没有控制线,设备/PC唯一知道它们是否连接的方式是通过接收到的数据。连接可能随时中断和重新建立。串行连接是全双工的。(8n1)
问题在于使用什么样的数据包、握手代码或类似内容。由于微处理器的能力极其有限,因此协议需要尽可能简单。但数据记录仪将具有许多功能,例如日志调度、日志下载、设置采样率等,这些功能可能同时处于活动状态。
我的臃肿版本如下:对于数据记录仪和PC,使用固定的16字节数据包大小,带有简单的1字节校验和,可能在数据包开头/结尾加入0x00字节以简化数据包识别,并使用一个字节表示数据包中的数据类型(命令/设置/日志数据/实时数据等)。为了同步,PC可以发送一个唯一的“hello/reset”数据包(例如全部为零),当设备检测到后,将返回以确认同步。
我欢迎任何关于这种方法的评论和其他建议以及一般性观察。

观察:我认为我需要自己制作,因为我需要它尽可能轻量级。我将从答案中建议的协议中取出一些部分,以及我发现的其他一些部分... Slip, PPPHLDC


1
希望你能找到一些东西,但大多数时候我只能自己动手了。不幸的是,微控制器上的代码需要非常简洁,因此序列化库会显得太重。 - Brad
3个回答

8
你可以使用谷歌的Protocol Buffers作为数据交换格式(如果你使用C语言,请查看C绑定项目)。这是一种非常高效的格式,非常适合这样的任务。

1
除了 Protocol Buffers 不执行任何校验和之外,如果您正在通过 RS232 或(更糟糕的是)某些无线连接进行通信,则可能会很有用。 - praseodym

4
微控制器互联网络(MIN)旨在为此设计:小型8位微控制器与其他东西进行通信。
该代码采用MIT许可证,有嵌入式C和Python实现。

https://github.com/min-protocol/min


1
我不会尝试从头开始发明什么,也许你可以重用过去的东西,如ZMODEM或其类似物?你提到的大部分问题都已经解决了,可能还有一些其他情况你甚至没想到。
关于zmodem的详细信息:http://www.techfest.com/hardware/modem/zmodem.htm c源代码是公共领域的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接