串口通信——组装成一个字节序列(`QByteArray`)

写多个寄存器的请求帧结构为:从站地址 + 功能码 0x10 + 起始地址高字节 + 起始地址低字节 + 寄存器数量高字节 + 寄存器数量低字节 + 数据字节数 + 寄存器数据(高字节在前) + CRC 校验(低字节在前)

组装成一个字节序列(QByteArray)。Modbus 协议传输的是二进制字节流,而我们程序中使用的通常是多字节的整数(如 16 位的 quint16),因此需要一种方法将这些多字节整数“拆分”成单个字节,这就是以下代码的目的。


1. >> (右移运算符)

  • 作用:将一个整数的二进制位整体向右移动指定的位数。
  • 示例startAddr >> 8
    • 假设 startAddr 的值为 200,其二进制表示为 00000000 11001000 (16位)。
    • 200 >> 8 表示将二进制位向右移动 8 位。
    • 移动后结果:00000000 00000000 (高8位移到了右边,低8位被丢弃)。
    • 所以,startAddr >> 8 的结果是 0
    • 再比如 startAddr0x1234 (十进制 4660):
      • 二进制:00010010 00110100
      • 0x1234 >> 8 结果:00000000 00010010 (即 0x12)。

结论value >> 8 的作用是获取一个16位整数的高8位字节


2. & (按位与运算符)

  • 作用:对两个整数的二进制位进行“与”操作。只有当对应的两个二进制位都为 1 时,结果位才为 1,否则为 0。
  • 示例startAddr & 0xFF
    • 0xFF 是一个特殊的掩码,其二进制表示为 00000000 11111111
    • startAddr (值为 200,二进制 00000000 11001000) 与 0xFF 进行按位与操作:
        00000000 11001000
      & 00000000 11111111
      -------------------
        00000000 11001000
      
    • 结果就是 200
    • 再比如 startAddr0x1234
        00010010 00110100
      & 00000000 11111111
      -------------------
        00000000 00110100
      
    • 结果是 0x34

结论value & 0xFF 的作用是获取一个16位整数的低8位字节


3. (char) (类型转换)

  • 作用:将一个值的类型强制转换为 char 类型。在很多系统中,char 是 8 位的。
  • 示例(char)(startAddr >> 8)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值