写多个寄存器的请求帧结构为:从站地址 + 功能码 0x10 + 起始地址高字节 + 起始地址低字节 + 寄存器数量高字节 + 寄存器数量低字节 + 数据字节数 + 寄存器数据(高字节在前) + CRC 校验(低字节在前)
组装成一个字节序列(QByteArray)。Modbus 协议传输的是二进制字节流,而我们程序中使用的通常是多字节的整数(如 16 位的 quint16),因此需要一种方法将这些多字节整数“拆分”成单个字节,这就是以下代码的目的。
1. >> (右移运算符)
- 作用:将一个整数的二进制位整体向右移动指定的位数。
- 示例:
startAddr >> 8- 假设
startAddr的值为200,其二进制表示为00000000 11001000(16位)。 200 >> 8表示将二进制位向右移动 8 位。- 移动后结果:
00000000 00000000(高8位移到了右边,低8位被丢弃)。 - 所以,
startAddr >> 8的结果是0。 - 再比如
startAddr是0x1234(十进制 4660):- 二进制:
00010010 00110100 0x1234 >> 8结果:00000000 00010010(即0x12)。
- 二进制:
- 假设
结论:value >> 8 的作用是获取一个16位整数的高8位字节。
2. & (按位与运算符)
- 作用:对两个整数的二进制位进行“与”操作。只有当对应的两个二进制位都为 1 时,结果位才为 1,否则为 0。
- 示例:
startAddr & 0xFF0xFF是一个特殊的掩码,其二进制表示为00000000 11111111。- 用
startAddr(值为200,二进制00000000 11001000) 与0xFF进行按位与操作:00000000 11001000 & 00000000 11111111 ------------------- 00000000 11001000 - 结果就是
200。 - 再比如
startAddr是0x1234:00010010 00110100 & 00000000 11111111 ------------------- 00000000 00110100 - 结果是
0x34。
结论:value & 0xFF 的作用是获取一个16位整数的低8位字节。
3. (char) (类型转换)
- 作用:将一个值的类型强制转换为
char类型。在很多系统中,char是 8 位的。 - 示例:
(char)(startAddr >> 8)

最低0.47元/天 解锁文章
1088

被折叠的 条评论
为什么被折叠?



