6

如果这是一个非常模糊的问题,我很抱歉,但我似乎无法正确地制定它来找到其他有这个问题的人。主要问题是,一旦您在两个设备之间建立了串行连接,您如何使用该连接来实现双向通信?

一个例子可能会有所帮助。假设你有一个温度传感器作为嵌入式设备,它使用一个用 C 语言编写的微控制器和固件。你有一个从该传感器到计算机的串行端口连接,并且计算机上的一些软件可以与之交互,比如 C++ 应用程序。我了解如何在两侧设置串行端口并在两个设备之间读取和写入单字节数据。真正的问题是您使用什么约定在两个设备之间进行通信?

假设您的要求如下

1.) 您需要能够发送命令以从嵌入式设备读取单个温度读数并将其发送到计算机以进行显示。

2.) 您需要发送命令以使传感器开始和停止流式传输温度值。

3.) 您需要一组命令来设置固件中的各个方面,例如流速率、启动时流、闪烁 LED 等。

4.) 您需要某种结构将复杂形式的数据发送到计算机,可能是一组电池电压读数。

实现这一目标的方法

人们似乎有几种方法可以做到这一点:

简单字符串 API:

最常见的处理第三方传感器,似乎使用一个简单的基于字符串的 API,这样启动和停止流的命令可能分别是“SS,1\r”和“SS,0\r”。在这种情况下,您必须从串行端口读取,直到您获得“\r”字符,然后解析您获得的数据以查看它是否具有命令(逗号左侧)和参数(逗号右侧)。这适用于上述场景 1 到 3,但不会使场景 4 变得非常容易。

JSON 字符串 API:

这与上面的工作方式相同,但不是将参数作为简单值传递,而是传递可以表示复杂数据结构的 JSON 对象。因此,您可以将电池电压数组作为 JSON 数组发送。此方法似乎涵盖了上述所有用例 1-4。但是 JSON 发送字符串,并且使用嵌入式 c 更难解析。它可以为计算机端创造奇迹,它可以使用更高级别的语言,例如具有用于读取 JSON 数据的库的 Java。

数据包样式 API:

这是我们接受的解决方案,我现在有点后悔。它涉及为我们发送的每条数据发送一个结构化的数据包约定。数据包结构如下图所示。

[0xFF][0xFF][ID][CMD][D0][D1][D2][D3][D4][D5][D6][D7][0xEE][0xEE][0xEE]

使用这种结构,我们发送一个用于验证数据包完整性的页眉和页脚(0xFF 和 0xEE),一个用于发送顺序数据包(用于传输数据数组)的 id,一个我们可以用来打包 long、float、int 等的数据数组,以及一个命令字节 (CMD),设备可以使用它来确定如何解析数据有效负载 (D0-D7)。

所以我问,通过串行端口进行通信的最首选方式是什么?还有其他我想念的方法吗?我最近一直在做很多 Web 开发,看起来 JSON 是一个很好的抽象传输系统,但是有它的局限性,因为你必须做更多的字符串解析,这在固件方面有点复杂。

4

2 回答 2

3

这里最大的问题是缺乏标准。几乎每个人都为约束设备或低级传输(如 UART / 串行线路)实现了自己的协议。但随着物联网趋势的增长,这种情况有望开始改变。

请查看 SLIP 和 SLIPMUX 以通过串行线路发送面向数据包的协议。

无论您发送 JSON、XML 还是其他任何内容,您都可能需要一些停止标志来终止您的消息。为了便于阅读,通常\n与 ASCII 编码内容结合使用,但这对于二进制编码的机器 2 机器通信来说并不是最好的。

SlipMux 向后兼容 SLIP(用于 IPv4 和 IPv6 数据包),但也支持新的消息类型,如 CoAP 和诊断(人类可读)消息。您可以简单地实现自己的数据包类型,例如“JSON”或“XML”消息。

作为一种协议,我可以推荐 CoAP 与 SlipMux 结合使用。CoAP 与 HTTP 非常相似,但更轻量级,因此对于大多数开发人员来说很容易处理。

于 2017-01-24T08:45:41.880 回答
2

二进制数据包格式因其明显的简单性和效率而具有吸引力。此外,一些通信链路已经以固定大小的数据包(USB、TCP/IP、文件系统等)的形式发送数据,但是,如果我不得不采取不同的方式,我不会再这样做了,因为以下缺点:

  • 不是人类可读的(除非您想混淆事物并保护您的协议:-))
  • 依赖于计算机体系结构:考虑字节序问题
  • 工具链依赖关系:例如,编译器 X 与编译器 Y 如何打包数据结构?
  • 链路依赖关系:如果链路发生变化,如果协议包大小和新链路包大小之间存在奇怪的匹配怎么办?

JSON 将是我现在的方式:ASCII 数据传输效率低于二进制传输,但它的便利性和可移植性抵消了这一点,除非应用程序有严重的带宽限制。我个人为 Arduino Uno 板编写了一个 JSON 解析器,它可以在不到 2 kb 的数据 RAM 中工作,包括系统堆栈。好吧,它可能会阻塞深度嵌套的 JSON 传输,但它足以从 Twitter 推文数据包中剥离关键元素,并证明它可以在小型系统上工作。

伊夫麦克唐纳

于 2013-10-25T03:42:23.230 回答