关于消息

来源:互联网 发布:linux vim 替换 编辑:程序博客网 时间:2024/05/22 17:36

消息完整性确认

1、使用消息间隔标记

描述:关于消息间隔的使用,应该可以分为消息开始标记、消息结束标记以及两者的混合模式。混合模式应该是普遍用法。
问题:消息体中出现了与标记相同的字段
分析:处理方法从两个方向入手:避免消息体中出现与标记相同的字段;使用某种方式能够区分消息体的字段与标记
1、避免消息体中出现与标记相同的字段
操作:这种方法在小公司中使用很普遍。标记字选取大于 f 的 ASCII 码的数,然后将原消息体的每个字节拆分为高 4 位 与 低 4 位,然后将每 4 位表示的 1 位16进制数用 ASCII 码表示
问题:将原消息的长度延长了一倍
结论:消息体很短时可以考虑
2、使用转义字符来区分消息体与消息标记
操作:确定一个转义字符(不必使用大多数编程语言中的 \),与消息标记或转义字符相同的字节,在其前方插入转义字符。这样,在接收消息时,先将消息体的 flag 设为 false , 收到转义字符时,丢弃该字节,并将消息体 flag 置为 true ,然后将收到的下一个字节存入缓存区,并将消息体 flag 重置为 false ,然后重复前面的步骤直到消息体 flag 为 false 时,收到了标记字节。

备注:为什么小公司喜欢用第一种方法?因为这类公司中很多程序员要么半路出家,要么就是硬件设计师兼职写软件,当你跟他提议采用第二种方法时,一听到需要什么转义字符,他就以为很复杂。而真实情况是第一种方法远比第二种方式复杂,方法一还需要考虑 1 位16进制的 10-15是采用的大写还是小写,以及如何获取 ASCII 码。

2、以消息的长度作为起始数据段

操作:用第一个字节来表示消息的长度,若消息长度大于255,则可以用第一个字节来表示后面几个字节表示消息长度,然后用后面收到的多个字节计算得到的长度来监视消息的结束
问题:该方式若未结合消息接收超时使用,可能出现致命错误。当某个长度数据错误或丢失导致后面接收到的消息都是错误的。

3、以接收超时作为消息结束信号

背景:消息基本是连续发送的,一条消息中的每个字节的发送间隔时间基本一致则可以推出接收间隔时间也基本一致,且大概为发送一个字节数据所需要的时间
操作:结合波特率,以及硬件的数据格式计算出字节间隔时间,将超时设为略大于该间隔时间,若接收超时发生,则表示当前消息接收完毕

备注:实际操作中,两条消息的间隔时间往往远大于发送一个字节数据所需时间,所以超时时间往往设置一个比较大但小于两条消息的最小时间间隔

小结

1、同时使用消息首尾标记时,将首、尾的标记设为不同值,否则在未结合接收超时时使用,可能出现第 2 类方案中的致命错误;
2、方案 1、2 最好结合方案 3 使用