Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 如何为嵌入式系统设计串行命令协议?_Embedded_Serial Port - Fatal编程技术网

Embedded 如何为嵌入式系统设计串行命令协议?

Embedded 如何为嵌入式系统设计串行命令协议?,embedded,serial-port,Embedded,Serial Port,我有一个嵌入式系统,通过串行通信。现在的命令结构设计为交互操作:它显示提示,接受一些命令,并以人类可读的形式显示结果 我正在考虑将其更改为一种更易于机器使用的格式,这样我就可以通过MatlabGUI与它进行对话,而不会遇到太多麻烦(现在它在交互式提示上打嗝,消息长度也在变化,等等) 那么,是否有一个文档或标准描述了如何为嵌入式系统设计一个好的串行命令协议呢?请看一看作为一个示例协议。从编写软件到使用RS232控制媒体和显示设备,我有一些偏好(和不满)。根据您的硬件,其中一些可能不适用: 我认为

我有一个嵌入式系统,通过串行通信。现在的命令结构设计为交互操作:它显示提示,接受一些命令,并以人类可读的形式显示结果

我正在考虑将其更改为一种更易于机器使用的格式,这样我就可以通过MatlabGUI与它进行对话,而不会遇到太多麻烦(现在它在交互式提示上打嗝,消息长度也在变化,等等)

那么,是否有一个文档或标准描述了如何为嵌入式系统设计一个好的串行命令协议呢?

请看一看作为一个示例协议。

从编写软件到使用RS232控制媒体和显示设备,我有一些偏好(和不满)。根据您的硬件,其中一些可能不适用:

  • 我认为这是一个好主意,使您的协议更加友好的自动化。如果您需要交互式界面(命令行或其他),请单独构建,并使用自动化协议。我不会太担心让它变得易读,但这取决于你

  • 始终返回响应,即使(特别是)收到无效命令。一些简单的东西,比如ACK为06美元,NAK为15美元。或者,如果你想让它更具可读性,就把它拼出来

  • 如果可以设置任何值,请确保有某种方法可以查询相同的值。如果您有很多值,那么查询它们可能需要一些时间。考虑有一个或几个元查询同时返回多个值。

  • 如果您有无法设置但很重要的信息(型号、序列号、版本、版权等),请确保可以查询这些信息,而不是在启动或重置时仅显示一次

  • 对于有效的命令,切勿以错误响应。你会认为这是显而易见的

  • 说到显而易见的,请记录硬件支持的串行设置。特别是当除您之外的任何人都要使用它时,您不希望他们在开始的30分钟内试图找出他们是否因为串行端口、连接、电缆或他们的软件而无法与设备通信。并不是说我很痛苦

  • 使用绝对命令而不是切换值。例如,使用单独的通电和断电命令,而不是发送相同的命令并打开和关闭电源开关

  • 响应应包括有关其响应的命令的信息。这样一来,任何程序都不需要记住最后一件它要求的事情来处理响应(参见下面的额外积分选项)

  • 如果您的设备支持待机模式(关闭,但不是真正关闭),请确保在此状态下查询仍能工作

根据您对数据完整性的偏执程度:

  • 用信封把你的信包起来。标题可以包括起始字符、消息长度和结束字符。以防收到部分或格式错误的消息。开始可能是02美元,结束可能是03美元

  • 如果你真的对消息的完整性有怀疑,那么就包括一个校验和。不过,它们可能有点痛

额外学分:

  • 如果您的硬件设置可以手动更改,则可以将此更改发送到串行端口,就像用户查询过一样。例如,您可能不希望用户能够更改公共显示监视器的输入源
我希望这有帮助

更新:

我忘了一些重要的事情。在你认真使用它之前,尤其是在你把它分发给别人之前,先在一些琐碎的事情上尝试一下,以确保它按照你期望的方式工作,并且(更重要的是)确保你没有遗漏任何东西。如果你在一个更大的项目中发现问题,需要花费更多的时间和精力去解决问题。p>
无论您是在设计命令协议、web服务、数据库模式还是类等,这都是一个很好的经验法则。

FTP是一个在交互和自动化方面都运行良好的协议示例。一个关键点是,响应以一个代码开始,该代码指示自动客户端是否应该支付atnetion。POP3也是如此

这些协议的一个优点是,在开发/调试时,您可以合理地从常规终端驱动通信,或者使用常规shell脚本/批处理文件/任何东西编写通信脚本


然而,他们没有做到的一件事是提供可靠性——这是由通信堆栈的较低层提供的。在大多数嵌入式通信PAH中都应该考虑到这一点。

除非带宽或延迟是一个大问题,否则尽可能使用ASCII,这会使调试更加容易

我喜欢先发送消息,然后再发送明确的“消息结束”字符(如“回车”)的协议。我通常不认为包的开始信号有那么大的帮助(那条线上还有什么?),使用CR作为消息结束也使通过终端程序进行测试变得更容易

更新:Bruce(在评论中)指出,数据包开头字符可以让您在发生损坏的情况下更快地找到数据包。如果没有数据包的开头字符,您需要等到下一个数据包的末尾才能知道自己在哪里,此时您将抛出两个数据包而不是一个数据包。

您看过Modbus()了吗?这是一个相当简单的协议,在每条消息上都包含一个校验和。它还向每个命令发送响应,即使是那些不需要“返回值”的命令,这样您就知道您的命令是否被正确接收。选择Modbus后,您唯一的选择是存储数据的寄存器地址以及任何使用的格式
 <slip packet start>
 message
 message crc
 <slip packet start>