文章目录
- 问题
- 办法
-
- 将 byte 数组,按合适位置合并
- 补充按位或运算
- 举例说明
- 总结
问题
书接上回,之前我将数据拆解成 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 数组后再传输,包含代码及分析。
第一个字节 data[0] = 01101010
。
第二个字节 data[1] = 00111111
。
运算 data[1] 的结果为
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 位进行传输。这里我们使用按位或、左移操作,将传输过来的数据进行了重新组合,得到了想要传输过来的真正数值。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
碰到这种问题,其实你的接口已经通了,但是在页面上就是访问不通过。 你可以把API请求地址单独拎出来新开个网站打开看请求是否成功,成功,但是你的项目不通。 有那么几个可能吧: 1、请求头设置错误 headers = { ‘Content-Type’: ‘ap…