如果这是一个非常模糊的问题,我很抱歉,但我似乎无法正确地制定这个问题以找到其他人。主要问题是,一旦在两个设备之间建立了串行连接,您如何使用该连接实现双向通信?
一个例子可能有所帮助。假设你有一个温度传感器作为嵌入式设备,使用微控制器和用C语言编写的固件。你有一个从传感器到计算机的串口连接,以及计算机上的一些软件与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(用于传输数据数据),一个数据数组,我们可以用它来打包longs,浮点数, int等,以及命令字节(CMD),设备可以使用它来确定如何解析数据有效负载(D0-D7)。
所以我问,通过串口进行通信的最佳方式是什么?我还有其他方法吗?我最近做了很多web开发,看起来JSON是一个很好的抽象传输系统,但它有其局限性,因为你必须做更多的字符串解析,这在固件方面有点复杂。
答案 0 :(得分:3)
这里最大的问题是缺乏标准。几乎每个人都为约束设备实现自己的协议,或者当涉及UART /串行线路等低级传输时。但随着物联网趋势的不断发展,这种情况有望开始发生变化。
请查看SLIP和SLIPMUX以通过串行线路发送面向数据包的协议。
无论您是发送JSON,XML还是其他任何内容,您都可能需要一些停止标志来终止您的消息。通常\n
与ASCII编码内容结合使用是为了便于阅读,但这不适用于二进制编码的机器2机器通信。
SlipMux向后兼容SLIP(用于IPv4和IPv6数据包),但也支持新的消息类型,如CoAP和Diagnostic(人类可读)消息。您可以简单地实现自己的数据包类型,如“JSON”或“XML”消息。
作为协议,我可以推荐CoAP与SlipMux结合使用。 CoAP与HTTP非常相似,但更轻量级,因此易于为大多数开发人员处理。
答案 1 :(得分:2)
二进制数据包格式因其明显的简单性和效率而具有吸引力。此外,一些通信链路已经将数据作为固定大小的数据包(USB,TCP / IP,文件系统等)发送,但是,如果我必须采用不同的方式,我不会再这样做,因为有以下缺点:
现在JSON将是我的方式:ASCII数据传输效率低于二进制传输,但它的便利性和可移植性抵消了这一点,除非应用程序具有严格的带宽限制。我个人为Arduino Uno板写了一个JSON解析器,它可以在不到2 kb的数据RAM中工作,包括系统堆栈。好吧,它可能会阻塞深度嵌套的JSON传输,但它足以从Twitter推文数据包中删除关键元素,并证明它可以在小型系统上运行。
Yves McDonald