0。前言作为一名嵌入式工程师,我们经常需要通过UART与外设打交道,而对于串行总线,我们往往要进行帧同步。通常的做法是在两个0x7E中间包含信令。另外,HDLC、PPP等协议也会有这种应用场景。那么如何从这些数据框中提取有效数据呢?本文通过一个简单的例子详细介绍了如何从帧中提取有效的协议信令。1.帧格式要求首先,我们明确帧提取的一些要求:(1)将信息字段中出现的每个0x7E字节转换为2字节序列(0x7D,0x5E)。(2)如果信息域中出现了0x7D字节(即出现了与转义字符相同的位组合),则将转义字符0x7D转换为2字节序列(0x7D,0x5D)。例如:一个PPP帧的数据部分:7D5EFE277D5D7D5D657D5E那么真正的数据其实就是7EFE277D7D65转换图:同样的,如果要发送数据,则取反。2、设计从底层上传的每个短帧的长度不固定。底层上传的每个短帧的7eheader位置不固定。可能有一个7e或两个7e。默认情况下,每一帧的数据最多为两个7e,例如:我们从底层收到的原始数据帧格式如下:那么我们必须能够提取出这两个7e之间的协议数据帧,并同时恢复帧中的所有7e。显然我们希望最终的分析结果如下:7e0f0e30271c00271c01271c027e00297e7e11737e7e00271c01271c027e00297e帧分析详细设计流程图数据,UINT8len)实现如下:inthdlc_rcv_frm(UINT8*data,intlen)代码实现如下:intmain(){intlen;chardata1[6]={0x7e,0xf,0xe,0x30,0x27,0x1c};chardata2[6]={0x0,0x27,0x1c,0x1,0x27,0x1c};chardata3[8]={0x2,0x7d,0x5e,0x0,0x29,0x7e,0x0,0x7e};chardata4[6]={0x11,0x73,0x7e,0x30,0x27,0x7e};chardata5[6]={0x0,0x27,0x1c,0x1,0x27,0x1c};chardata6[6]={0x2,0x7d,0x5e,0x0,0x29,0x7e};#if0printf("************测试hdlc_send()******************\n");len=hdlc_send(data1,6);printf("********************结束*********************\n\n");#endifprintf("\n************测试hdlc_rcv_frm()*********************\n");hdlc_rcv_frm(数据1,6);hdlc_rcv_frm(数据2,6);hdlc_rcv_frm(数据3,8);hdlc_rcv_frm(数据4,6);hdlc_rcv_frm(数据5,6);hdlc_rcv_frm(数据6,6);printf("**********************结束***************************\n");}结果如下:运输结果如下:注意这段代码还有一些bug,暂时没有修改,所以在实际项目中谨慎使用,注意数组越界!完整代码链接:链接:https://pan.baidu.com/s/1rPEDC3erLpPRH0OnkfNH_A提取码:wzxq
