你从最基本的需求出发,然后一步步考虑是否需要追加附加信息。 比如,你就是要传 3 字节数据,分别是温度、湿度、脉搏。如果间隔时间够长,仅发送这三个字节就可以了。也还是理解为起始信号和结束信号就是至少长度 N 字节的空闲状态,如果你发送此 3 字节的间隔小于 N 的话。 如果你是很频繁地发送,且字节间的间隔不定。那接收方就必须要一个方法找到开头。这样你就会需要加上包头和包尾。不仅仅如此,你的包头和包尾必须不会与实际数据混淆,也就是要用实际数据不会用到的值。比如,你设定包头包尾是 0x4F 和 0xF4,那这两个值就不能出现的实际数据中。一个解决方案就是,实际数据用 ASCII 编码,即数字 0 - 9 用 0x30 - 0x39 表示,如果还要支持十六进制字符 A - F,还要加上 0x41 - 0x46。这样一来,你一个十六进制字节的值,就要用 2 个 ASCII 字符表示。当然,你可以把实际数据都用十进制表示,例如用 3 个 BCD 码,那每个数据域要用 6 个 ASCII 字符,三个域共 18 个 ASCII 字符。 最后,你是否需要纠错。如果你的传输环境不是非常可靠,有可能出现传输错误,你就可能需要在包中加上错误校验域(当然也可以仅仅依赖于串口的奇偶校验),可以用 LRC 或 CRC。 总之,需求越高,系统越复杂。完全取决于你的实际应用需求。
[quote=引用 5 楼 qq_27639619 的回复:] ,如何将这些头、标志位、温度、心跳等信息组成一个数据包呢?直接做成字符串好像是不行的。谢谢
,如何将这些头、标志位、温度、心跳等信息组成一个数据包呢?直接做成字符串好像是不行的。谢谢
[quote=引用 3 楼 qq_27639619 的回复:] 谢谢,当open、初始化好串口,然后发送数据的时候,怎么把这一串数据包发送出去呢,谢谢
谢谢,当open、初始化好串口,然后发送数据的时候,怎么把这一串数据包发送出去呢,谢谢
这是完全的自定义协议,你想怎么定义都行。例如一帧数据: 帧头(两个字节)+标识位(一个字节)+类型(一个字节)+数据长度(一个字节,或者多个字节)+数据(多个字节)+校验位(一个字节)+帧尾(一个字节) 等等,你可以增加。
3,846
社区成员
5,006
社区内容
加载中
试试用AI创作助手写篇文章吧