2026/4/24 8:57:42
网站建设
项目流程
咸阳网站建设,开发是什么工作,企业网站制作策划书,网站开发 票种在串口通信中#xff0c;若帧头字节#xff08;比如0xFA#xff09;和数据段中的字节完全一致#xff0c;从机极易误将数据当成帧头#xff0c;导致解析错位。以下是3种可落地的解决方法#xff0c;结合具体例子拆解#xff0c;新手也能快速理解#xff1a;一、转义法若帧头字节比如0xFA和数据段中的字节完全一致从机极易误将数据当成帧头导致解析错位。以下是3种可落地的解决方法结合具体例子拆解新手也能快速理解一、转义法给特殊字节“做标记”最通用核心思路选定帧头/帧尾如0xFA先遍历原始数据将数据中所有和帧头/转义符重复的字节“转义”成特殊组合确保数据段中不再出现帧头接收端再通过“反转义”还原原始数据从根源区分帧头和数据。实战例子以帧头0xFA、转义符0xFB为例1. 定义转义规则原始数据中的0xFA帧头→ 转义为0xFB 0x01原始数据中的0xFB转义符本身→ 转义为0xFB 0x02转义后手动在帧尾添加0xFA作为帧结束标记。2. 发送端转义过程假设要发送的原始数据0xAA 0xFA 0x55 0xFB 0x01 0x88含帧头0xFA和转义符0xFB。 遍历转义后0xAA→ 无需转义保留0xFA→ 转义为0xFB 0x010x55→ 保留0xFB→ 转义为0xFB 0x020x01→ 保留0x88→ 保留帧尾添加0xFA作为结束标记。最终发送的完整帧0xAA 0xFB 0x01 0x55 0xFB 0x02 0x01 0x88 0xFA。3. 接收端反转义过程接收端收到上述帧后先找到帧尾0xFA确认一帧结束再遍历数据段反转义遇到0xFB 0x01→ 还原为0xFA遇到0xFB 0x02→ 还原为0xFB普通字节直接保留。反转义后还原原始数据0xAA 0xFA 0x55 0xFB 0x01 0x88完美区分了数据中的0xFA和帧尾的0xFA。注意点缺点若数据中0xFA/0xFB出现频繁转义后数据长度会“膨胀”比如1个0xFA变成2个字节优化选业务数据中出现概率极低的字节做帧头/转义符比如0x7D/0x55减少转义次数。二、COBS协议用“距离字节”消除特殊边界无数据膨胀核心思路COBS一致开销字节填充是一种无膨胀的转义算法选定一个“特殊字节”如0x00通过“距离字节”标记到下一个特殊字节的长度消除数据中所有特殊字节接收端以特殊字节为帧尾按距离字节还原数据避免特殊字节帧边界和数据重复。实战例子以特殊字节0x00为例1. 发送端COBS编码过程假设要发送的原始数据0xAA 0x55 0x00 0x11 0x22 0x33含特殊字节0x00。 编码规则第一个字节为“距离字节”表示“从距离字节的下一个字节开始到下一个0x00的字节数”若直到0xFF个字节都没0x00距离字节填0xFF并在第0xFF位新增距离字节。具体编码步骤原始数据前加“距离字节”从第一个字节0xAA开始到0x00共3个字节0xAA、0x55、0x00因此距离字节填0x03跳过原始数据中的0x00从0x11开始继续编码0x11、0x22、0x33后无0x00距离字节填0x04包含自身到末尾的4个字节帧尾添加0x00作为结束标记。最终编码后发送的帧0x03 0xAA 0x55 0x04 0x11 0x22 0x33 0x00数据中无0x00仅帧尾有。2. 接收端COBS解码过程接收端收到0x00后确认一帧结束读取第一个距离字节0x03表示从下一字节开始取3个字节0xAA、0x55并在第3位补回0x00读取下一个距离字节0x04表示从下一字节开始取3个字节0x11、0x22、0x33距离字节0x04表示“到末尾无0x00取0x04-1个字节”拼接还原原始数据0xAA 0x55 0x00 0x11 0x22 0x33。优势无数据膨胀仅增加1个距离字节适合对带宽敏感的场景缺点是编码/解码逻辑比普通转义稍复杂。三、魔数帧头长度校验最简单易实现工业级常用核心思路用“多字节魔数”做帧头比如0xDE 0xAD 0xBE 0xEF或字符ZYNB利用“多字节组合在数据中出现的概率极低”的特点减少误判再通过长度字段限定数据范围最后用校验值验证整帧合法性无需复杂转义。实战例子以魔数帧头0xDE 0xAD 0xBE 0xEF为例1. 定义帧结构字段字节数说明魔数帧头40xDE 0xAD 0xBE 0xEF唯一标识数据长度1后续数据段的字节数数据段N实际要发送的业务数据CRC16校验2对“数据长度数据段”的校验值2. 发送端封装过程假设要发送的业务数据0xFA 0x55 0xAA含单字节0xFA易和单字节帧头混淆但和4字节魔数无冲突。 封装步骤加魔数帧头0xDE 0xAD 0xBE 0xEF加数据长度数据段共3字节填0x03加数据段0xFA 0x55 0xAA计算CRC16对0x03 0xFA 0x55 0xAA计算得0x1234示例值填0x12 0x34。最终发送的完整帧0xDE 0xAD 0xBE 0xEF 0x03 0xFA 0x55 0xAA 0x12 0x34。3. 接收端解析过程接收端持续搜索0xDE 0xAD 0xBE 0xEF由于4字节组合在数据中几乎不会出现搜到即判定为帧头读取后续1字节长度0x03按长度读取3字节数据段0xFA 0x55 0xAA读取最后2字节CRC160x12 0x34重新计算0x03 0xFA 0x55 0xAA的CRC16若和接收值一致说明帧合法即使数据段中有0xFA也因“按长度读取”“CRC校验”不会误判为帧头。优势实现最简单无需转义工业场景如工控、物联网中最常用缺点是若极端情况下数据段恰好出现魔数帧头会导致解析错误概率极低可通过重传/应答机制兜底。总结方法核心逻辑优点缺点适用场景普通转义转义特殊字节消除数据中的帧头逻辑简单易调试数据可能膨胀小数据量、低带宽要求COBS协议距离字节标记特殊字节位置无数据膨胀效率高编码解码稍复杂大数据量、带宽敏感场景魔数长度校验多字节帧头长度限定校验实现最简单工业常用极端情况有误判风险绝大多数串口通信场景实际开发中优先选“魔数帧头长度CRC16”够用且易维护若对数据膨胀敏感再选COBS协议普通转义适合快速验证场景。结论在项目实战中我目前选择的是第三种方案大家选用哪种方案可以在评论区说出来。