如果这是一个非常模糊的问题,我很抱歉,但我似乎无法正确地制定它来找到其他有这个问题的人。主要问题是,一旦您在两个设备之间建立了串行连接,您如何使用该连接来实现双向通信?
一个例子可能会有所帮助。假设你有一个温度传感器作为嵌入式设备,它使用一个用 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 是一个很好的抽象传输系统,但是有它的局限性,因为你必须做更多的字符串解析,这在固件方面有点复杂。