- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在努力转换在特定微 Controller 上运行的程序,并使其适应在树莓派上运行。我已经成功地从我一直在使用的传感器中提取值,但现在我遇到了一个问题,我认为这是由我无法理解的几行代码引起的。我已经阅读了它们是什么,但仍在摸不着头脑。我认为下面的代码应该修改存储在 X,Y,Z
变量中的数字,但是我认为这不会发生在我当前的程序中。此外,我还必须将 byte
更改为 INT
以使程序编译无误。这是我转换的原始代码中未修改的代码。有人能告诉我这是否在修改号码吗?
void getGyroValues () {
byte MSB, LSB;
MSB = readI2C(0x29);
LSB = readI2C(0x28);
x = ((MSB << 8) | LSB);
MSB = readI2C(0x2B);
LSB = readI2C(0x2A);
y = ((MSB << 8) | LSB);
MSB = readI2C(0x2D);
LSB = readI2C(0x2C);
z = ((MSB << 8) | LSB);
}
这是原始的 readI2C 函数:
int readI2C (byte regAddr) {
Wire.beginTransmission(Addr);
Wire.write(regAddr); // Register address to read
Wire.endTransmission(); // Terminate request
Wire.requestFrom(Addr, 1); // Read a byte
while(!Wire.available()) { }; // Wait for receipt
return(Wire.read()); // Get result
}
最佳答案
I2C是一种用于与低速外设通信的 2 线协议(protocol)。
您的传感器应通过 I2C 总线连接到您的 CPU。您正在从传感器读取 3 个值 - x、y 和 z。这些值可作为 6 x 8 位
寄存器从传感器访问。
x - Addresses 0x28, 0x29
y - Addresses 0x2A, 0x2B
z - Addresses 0x2C, 0x2D
ReadI2C()
正如函数名称所暗示的那样,从您的传感器的给定地址读取一个字节的数据并返回正在读取的数据。 ReadI2C()
中的代码取决于您设备的 I2C Controller 的设置方式。
一个字节是 8 位数据。 MSB(Most-Significant-Byte
)和 LSB(Least-Significant-Byte
)分别表示通过 I2C
读取的 8 位。看起来您对 16 位数据(对于 x、y 和 z)感兴趣。要从 2 段 8 位数据构造 16 位数据,您将 MSB
向左移动 8 位,然后与 LSB< 执行逻辑或运算
.
例如:
Let us assume: MSB = 0x45 LSB = 0x89
MSB << 8 = 0x4500
(MSB << 8) | LSB = 0x4589
同时查看我的内联评论:
void getGyroValues () {
byte MSB, LSB;
MSB = readI2C(0x29);
LSB = readI2C(0x28);
// Shift the value in MSB left by 8 bits and OR with the 8-bits of LSB
// And store this result in x
x = ((MSB << 8) | LSB);
MSB = readI2C(0x2B);
LSB = readI2C(0x2A);
// Do the same as above, but store the value in y
y = ((MSB << 8) | LSB);
MSB = readI2C(0x2D);
LSB = readI2C(0x2C);
// Do the same as above, but store the value in z
z = ((MSB << 8) | LSB);
}
关于c - 了解 MSB LSB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183530/
如何在c#中用另一个字节的LSB替换一个字节的LSB。 类似这样的 字节1 - 0 1 1 1 1 1 1 1 字节2 - 0 0 1 1 1 0 0 0 现在我希望将 byte1 的 lsb(即“1
我希望将 LSB、MSB 的字节数组转换为 int 的数组 目前,我正在使用 for 循环并单独转换每组值, void ConvertToInt(int OutArray[], byte InArra
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我想分配一个 std_logic_vector 而不给出界限。像这样: constant xy: std_logic_vector := "100111"; 当我想访问单个位时: xy(0), xy(
我检查了用于反转位顺序的 SWAR 算法(SIMD W在 A Rregister 中) unsigned int 的。 signed int 有类似的东西吗? 最佳答案 该算法仅适用于无符号整数,因为
当您使用 LSB 隐写术加密图像时,它会改变一些像素。我的问题是,如果说您使用 ffmpeg 在视频中输入该图像并重新编码视频加上图像,像素是否仍会被更改并且能够被解密? 最佳答案 这取决于编码期间使
我正在尝试更改数值的 LSB,例如 50,其中 LSB 为 0,因为 50 % 2 为 0(余数运算符),值为 1。因此,在这种情况下,将 LSB 从 0 更改为 1。代码如下: //Get the
我正在尝试实现一个简单的编码程序,可以在图像像素的 LSB 中隐藏消息。到目前为止,我已经从消息中获取了字节数组 private static byte[] ConvertMessageToB
当你和一些带有掩码的数据时,你会得到一些与数据/掩码大小相同的结果。我想要做的是获取结果中的掩码位(掩码中有 1)并将它们向右移动,以便它们彼此相邻,我可以对它们执行 CTZ(计数尾随零) . 我不知
我正在尝试实现一种基本的速记技术,其中我用消息图像的 MSB 替换载体图像的 LSB。 LSB 可以属于任何 RGB channel 。 我的方法非常幼稚,因为我正在循环 message_matrix
我尝试在 C 中这样做: int val = 0xCAFE; int uc = val & 14; if (val & 15 == 15 || val & 7 == 7 || val & 11
更新************************作为引用,我包含了用于打开 PPM 图像的程序 - 将消息嵌入到图像中,然后保存带有嵌入文本的新图像。通过下面的函数,我希望额外添加该消息(隐藏在
我只是想知道是否有人可以帮助我设置/清除音频样本的 LSB 下面的代码遍历一个包含 24 个元素的数组,每个元素都添加到文件中,并在后面添加一个新行。 FILE *fp; fp = fopen(Emb
我知道使用 LSB 意味着您可以将消息存储在图像载体大小的 12% 左右。 我制作了一个 java 程序,它将一条消息分成 n 个片段,并用这些片段填充图像载体,直到 12% 都被占用。我这样做是为了
我有一个来自 GTK/glib 2 的 GSList,它们只存储完整的指针,我真的不想要额外的分配。我如何进行位操作以在这些指针中存储额外数据? 我想我不能只拿一个指针然后做 tagged_ptr =
我在网上读到了LSB插入,但它只介绍了如何向LSB插入位,但没有描述如何提取位。这是我读过的关于LSB insertion的文章. 我理解他们下面使用的方法,但是如何提取这些位? 最佳答案 这是获取加
我有一个函数返回 1 Byte uint8_t fun(); 该函数应该运行 9 次,所以我得到 9 字节 我想将最后一个 8 作为 4 short values 这里我所做的,但是我'我不确定我得到
我的程序从硬件设备接收一个字节类型的日期时间数据包。一个示例数据包是: byte[] packet = new byte[] {0x0C, 0x01, 0x15}; //packet[0] is th
我很难理解 LSB based steganography第 2 节中给出的方法。互联网上的示例非常困惑和不清楚。我正在关注 Matlab 实现 https://www.mathworks.com/m
我有一个二进制文件,我需要了解它并修改它的行为,但我以前从未在 Linux 上重写过某些东西,只是在 Windows 上重写过。有人可以向我推荐一种方法/程序来查看此二进制文件的 ASM、跟踪其运行时
我是一名优秀的程序员,十分优秀!