【Visual Studio】Qt 接收串口发送过来的数据,使用按位或运算,将两个 8 位数据,合并成一个 16 位的整数

问题

书接上回,之前我将数据拆解成 8 位,保存到字节数组中传输过去了。这次,我基于 Visual Studio 开发 Qt 环境,使用 C++ 语言进行接收,再合并回来。

关于拆解,我是在 Arduino IDE 环境下完成的。详细细节可参考文章:【Arduino】串口数据传输时,使用按位与、右移将数据拆解成 8 位,分别保存到 byte 数组后再传输,包含代码及分析

办法

将 byte 数组,按合适位置合并

先上核心代码

QByteArray data = m_SerialPort.read(2);
int Channel1 = (data[1] << 8) | data[0];

第一行表示从串口中读取 2 个字节的数据,存储到 QByteArray 类型的变量 data 中。

第二行表示将变量 data 的第 2 位字节数据左移 8 位,和第 1 位字节数据进行组合,得到的值赋给变量 Channel1

补充按位或运算

在按位或运算中,每个位的结果由两个操作数对应位的逻辑或操作确定。

规则为:

  • 如果两个操作数的对应位中至少有一个位为 1,则结果位为 1;
  • 否则,结果位为 0。

例如,考虑以下两个二进制数的按位或运算:

1 0 1 0 1 0 1 1 (171)
1 1 0 0 1 1 0 0 (204)
|
1 1 1 0 1 1 1 1 (239)

举例说明

比如当要传输的数据是 16234 时,实际传过来的是 data = data[0] data[1] = 01101010 00111111,至于为什么是这样,同样参考文章:【Arduino】串口数据传输时,使用按位与、右移将数据拆解成 8 位,分别保存到 byte 数组后再传输,包含代码及分析

扫描二维码关注公众号,回复: 15827259 查看本文章

第一个字节 data[0] = 01101010
第二个字节 data[1] = 00111111
运算 data[1] << 8 的结果为 00111111 00000000
按位或 | 运算,发生如下运算过程

0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 (16128)
|
0 1 1 0 1 0 1 0 (106)
0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 (16234)

可以看到最终得到的结果就是 Channel1 = 16234,与我们想要传输的数据结果一致。

总结

之前是通过按位与、右移操作,将数据拆解成 8 位进行传输。这里我们使用按位或、左移操作,将传输过来的数据进行了重新组合,得到了想要传输过来的真正数值。

猜你喜欢

转载自blog.csdn.net/weixin_36815313/article/details/131408372