强制转化的一个bug!第一次用就失败了

博客围绕格式报文展开分析,定义了结构体 `bleModuleReceiveCmdType`。在对报文数据处理时,使用指针强转技巧失败,而通过 `memcpy` 复制到实例结构体则成功。经分析,问题根源在于字节序,还提出了另一个修改思路。

我RX获得:【hex】

69 74 61 7A 00 1B 01 00 01 00 00

其实是格式报文:

typedef struct  _bleModuleReceiveCmd
{
    uint8_t     class[4];
    uint16_t    command;
    uint8_t     response;
    uint16_t    length;
    uint8_t     data[250];
    uint8_t     crc;
    uint8_t     cnt;
    uint8_t     pos;
    uint8_t     flag;
}bleModuleReceiveCmdType;

分析:uint8_t *rxdata就是过来的上面的报文   newrxdata是我要分析后的输出!

static uint8_t ble_Analysis_Rxdata( uint8_t *rxdata,uint8_t *newrxdata)
{
        uint8_t idx =0;
    bleModuleReceiveCmdType *rx=(bleModuleReceiveCmdType *)rxdata;

//为什么这里使用强转技巧 失败 必须自己手工算?    
printf("%d--WHY WRONG?\r\n",rx->command);//6912
printf("%d--\r\n",rx->response);//1
printf("%d--\r\n",rx->length);//1
printf("%d--\r\n",rx->data[0]);//0
printf("%d--\r\n",rx->crc);//0
//DIY    
        rx->command = rxdata[4]<<8 |rxdata[5];
        printf("%d--",rx->command);//27
//实体
bleModuleReceiveCmdType rxd;
memcpy(&rxd,rxdata,sizeof(bleModuleReceiveCmdType));
printf("%d--WHY WRONG?\r\n",rxd.command);//27-----其实del前面的也是0X1B00

printf("%d--\r\n",rxd.response);//1
printf("%d--\r\n",rxd.length);//1
printf("%d--\r\n",rxd.data[0]);//0
printf("%d--\r\n",rxd.crc);//0

//////可以看到 指针失败!!!实例结构体的话成功!因为memcpy!!!

具体是啥道理???

 

【6912】===【0x1B00】看来是对的 !!错误的是字节序啊!!!!!

 

 

另外一个修改思路:

static uint8_t ble_Analysis_Rxdata( bleModuleReceiveCmdType *rxdata,uint8_t *newrxdata)

其实也是一样的 问题就是!!字节序!!!!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值