今天写报文发送帧的时候需要将一个16位数据拆成两个8位的来对发送缓冲区进行赋值,于是我写了如下代码:
rs485_txbuff[3] = (*(read[addr + i].Info) >> 8) * 0xff;
rs485_txbuff[4] = (*(read[addr + i].Info)) * 0xff;
//addr寄存器地址,uint6_t
//i 一个变量,uint16_t
//rs485_txbuff 发送缓存区,其中每个元素类型都是uint8_t
运行时发现不管取哪个寄存器的值最后结果都是0,等式右边那一堆值始终是0x0000 0000。
于是开始排查错误,首先检查指针用法是否正确,指针用法无误,再检查取高低位操作是否正确,果然,操作错误,正确的取高低位不应该用*,而是应该用&,于是改为如下:
rs485_txbuff[3] = (*(read[addr + i].Info) >> 8) & 0xff;
rs485_txbuff[4] = (*(read[addr + i].Info)) & 0xff;
最终得到结果正确。