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