自定义协议的命令解析器(2)


  关于上一篇自定义协议的命令解析器,解决了很大一部分问题,但是并不完整, 代码可读性还是较差。因为对于字节所表示的含义真是太原始了,需要的是变量所表示的含义。幸好我多看了几篇文章,找到了个解决方法。同时这个解决方法能顺便把协议的报文打包问题给解决了。报文解析和打包就像是硬币的正反面一样是不可分割的。

大致实现思路

  参考的两篇文章是:“结构体嵌入联合体”在协议解析中的神操作认识认识#pragma、#error指令一个提供大致的实现思路,一个解决实际操作中遇到的内存对齐问题。那篇文章并没有解决字节数据可读性的问题,所以只能说提供了大致的实现思路。那篇文章是这样的:

image-20210523120045139

  我使用的方式是这样的,将字节数组提取出来,放在联合体中,每个结构体只表示需要的变量的含义。

image-20210523120157987

image-20210523120226048

  调用方式是这样的:

/* 由字节数组方式 转为 结构体方式查看 */
sPack * data_pack = (sPack *)RecvBuff;

/* 输出 接收缓冲区中表示 参数长度 的字节 */
printf("data_pack param_length is : %d \r\n", data_pack->param_length);
/* 输出 接收缓冲区中表示 方法 的字节 */
printf("data_pack method is : %d \r\n", data_pack->method);
/* 输出 接收缓冲区其余字节数据 */
for(uint8_t i=0; i<MAX_LENGTH - 2; i++)
{
   
    printf("0x%02x ", *(data_pack->data.data + i));
}
printf("\n\n");

/* 调用相应的函数对数据进行解析 */
test_func1(&(data_pack->data));
test_func2(&(data_pack->data));
test_func3(&(data_pack->data));
test_func4(&(data_pack->data));


void test_func1(DataField * user_data)
{
   
    if(user_data == NULL)   //if(! user_data)
    {
   
        return;
    }

    printf("from function : %s \r\n", __FUNCTION__);
    /* 调用数据:可读、可写 */
    printf("steer address is : 0x%04x \r\n", user_data->func_type1.steer_addr);
    printf("steer angle is : 0x%04x \r\n", user_data->func_type1.steer_angle);
    printf("motor address is : 0x%04x \r\n", user_data->func_type1.motor_addr);
    printf("motor speed is : 0x%02x \r\n", user_data->func_type1.motor_speed);
}

遇到的问题

  在实际测试的过程中,遇到一个字节对齐的问题,现象就不描述了,有感兴趣的可以将以下两句话注销掉。前后对比一下。

#pragma pack(1)     /* 指定按1字节对齐 */
#pragma pack()      /* 取消自定义字节对齐 */

验证结果

image-20210523122032406

image-20210523122238261

源代码

  以下源代码是可以直接编译运行的,运行方式不大清楚的可以查看这篇文章:编译C代码环境搭建,推荐使用VS Code,如果嫌麻烦的话也可以网上搜菜鸟C在线工具,直接复制过去点击运行。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值