【Arduino】串口数据传输时,使用按位与、右移将数据拆解成 8 位,分别保存到 byte 数组后再传输,包含代码及分析_arduino 移位

文章目录

问题

当数据在不同系统之间传输时,因为不同系统可能对字节的顺序有所不同。因此,需要将一个 16 位的值拆分为两个 8 位的字节,并将高位字节和低位字节需要分开存储。这样,能防止数据在传输过程中出现混乱的情况。

办法

将数据拆成 8 位,保存到 byte 数组

先上核心代码

analogReadResolution(2);  // MAX\_READING\_14\_bit = 16383 0-16383=16384 values = 2^14
int data = analogRead(A0);   // 0-16383
byte msg[14];
msg[0] = data&255;
msg[1] = (data>>8)&255;

第一行表示设定 Arduino 开发板的模拟口精度为 14 位。

至于为什么精度能够设置成 14 位,因为我用的开发板是 Arduino Portenta H7,最大精度可到 16 位。更多资料可以看这篇文章:【Arduino】Portenta H7 板子介绍

第二行表示从 Arduino 的 A0 口读取一个模拟数值,其范围为 0-16383。

注意 ADC 的精度已经提前规定成了 14 位精度,所以最大值才是 2^14 = 16384-1。

第三行表示创建一个 byte 字节类型的数组 msg,数组的长度位 14 位,刚好对应了我们设定的模拟口读取精度。

第四行和第五行是将数据通过 按位与右移 操作将 data 的低 8 位和高 8 位分别存储到 msg 数组的第 1 位和第 2 位。


补充按位与运算

按位与运算 (Bitewise AND) 是一种针对二进制数的逐位运算操作符。它对两个二进制数的对应位进行逻辑与操作,生成一个新的二进制数。

规则为:

  • 如果两个对应位都为1,则结果的对应位为1。
  • 如果两个对应位中有任何一个位为0,则结果的对应位为0。

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

10101011(171)
11001100(204)
&
10001000(136)

补充右移运算

在C++中,右移操作使用右移位运算符 >> 表示。对于一个二进制数,右移操作将其所有位向右移动,移出的位将被丢弃,并在左侧补上 0。


例如,考虑以下二进制数的右移操作:

11001100(204)
>>3
00011001(25)

举例说明

比如当 data = 16234 时,在计算机中 data 的二进制表示为 00111111 10101010


按位与运算符 &data 与 255 进行按位与运算,相当于将 data 的高 8 位全部置为 0,保留了低 8 位,并存储到数组 msg 的第一个元素 msg[0] 中。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

真正体系化!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值