字节流数据解析

各种与硬件底层相关的数据大都是字节型的传输方式,如串口,如果协议定的不好,解析写不好,就会发生丢包。近期在做linux串口的数据通讯时,发生了让人头疼的丢包,后分析解析代码发现一旦数据段中含有帧头便会解析不到数据,通过一上午的调试,写了一个新的解析。

#include <stdio.h>

//帧头 长度 命令 数据 校验 (帧尾:可以不需要,也可以当做简单的校验)
//解析思路:接收到帧头后,根据长度来读取数据,最后校验(如果数据中有帧头则会跳过,不影响解析)
//示例:帧头-0xaa,0x02 长度-0x07 帧尾-0xbb

uint8_t buff[24] ={0x21,0xAA,0xAA,0x02,0x07,0xAA,0xBB,0xBB,0xff,0x34,0x99,0xbb,
                   0xaa,0xAA,0x02,0x07,0xA7,0xB7,0xaa,0xff,0x14,0xa9,0xbb,0x00
                  };

int main(int argc, char *argv[])
{
    uint8_t i=0;
    uint8_t tbuf = 0;

    uint8_t cnt = 0;//解析状态标记
    uint8_t scnt = 0;//数据段角标
    uint8_t slen = 0;//数据段长度
    uint8_t *psbuf = NULL;//数据段缓冲区

    while(i<24)
    {
        //printf("%x ",buff[i]);

        tbuf = buff[i];

        if((tbuf == 0xAA)&&(cnt == 0))//可能第一个头
            cnt = 1;

        switch(cnt)
        {
        case 1:
            if(tbuf == 0x02)//第二个头
                cnt = 2;
            break;
        case 2:
            slen = tbuf;//读取长度
            psbuf = (uint8_t*)malloc(slen*sizeof(uint8_t));//开辟空间
            scnt = 0;//复位数据段缓冲区

            cnt = 3;
            printf("slen:%d\n",slen);
            break;
        case 3:
            psbuf[scnt] = tbuf;
            if(scnt == slen-1)
            {
                cnt = 0;//接收到最后一个字节就复位
                printf("finished!\n");//解析完毕

                for(int k=0;k<slen;k++)
                    printf("%x ",psbuf[k]);
                printf("\n");

                free(psbuf);//释放动态内存
            }
            scnt++;
            break;
        default:
            break;
        }

        i++;
    }
    printf("\n");
    return 0;
}
  • 调试经验:在qt中不要强行想把协议和串口类分开,因为实现起来比较困难,虽然可以利用回调和继承实现但是如果用到ui,需要在回调和继承里更新ui就非常麻烦。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 Flask 的 Response 对象来同时返回字节流数据和数组数据。以下是一个示例代码: ```python from flask import Flask, Response import numpy as np app = Flask(__name__) @app.route('/') def index(): # 生成一些随机数据 data = np.random.rand(10) # 将数据转换为字节流 data_bytes = data.tobytes() # 创建一个 Response 对象,同时包含字节流数据和数组数据 response = Response(data_bytes, mimetype='application/octet-stream') response.headers['X-Data'] = str(data.tolist()) return response if __name__ == '__main__': app.run() ``` 在这个示例中,我们使用 NumPy 生成了一些随机数据,并将其转换为字节流。然后,我们创建了一个 Flask 的 Response 对象,将字节流数据作为第一个参数传递,并将 mimetype 设置为 'application/octet-stream',表示这是一个二进制数据流。我们还将数组数据转换为字符串,并将其添加到 Response 对象的 headers 中,以便前端可以访问它。 当您访问这个 Flask 应用程序时,它将同时返回字节流数据和数组数据。您可以使用 JavaScript 从 Response 对象中获取这些数据,例如: ```javascript fetch('/') .then(response => { const dataBytes = response.arrayBuffer(); const dataStr = response.headers.get('X-Data'); const data = JSON.parse(dataStr); // 处理数据... }); ``` 在这个 JavaScript 代码中,我们使用 fetch 函数从 Flask 应用程序中获取数据。我们使用 arrayBuffer 方法获取字节流数据,使用 headers.get 方法获取数组数据,并将其解析为 JSON 对象。然后,我们可以使用这些数据进行进一步的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值