我试图从SPI传感器获取两个字节并连接它们(不添加它们或按位或它们)。我有:11111和1111100.我想要的:0001111101111100(十进制8060)。
当我的Serial.print(firstByte,BIN)我的两个字节时,Arduino似乎删除了前导0(可能是因为正在进行某种转换而且那些0'没有贡献数字或某物的价值)。
这对我来说是一个问题,因为在将这个双字节二进制数转换为十进制整数之前,我想连接这两个字节,包括前导0。
有谁知道一个好的方法?我想将它们存储为char数组,但不确定。在上面的例子中,我可以手动添加一个' 0'但是,如果这些比特值永远不会改变,那真的只会起作用,这将是一个问题。
以下是我的参考代码: https://gist.github.com/vwls/852fb5c53112efc77faaecd6bffba25f
任何建议都会非常有用!
答案 0 :(得分:1)
#include <iostream> // only for debug output
int main()
{
// example how to concatenate two 8 bit values into 16 bit value
uint8_t b1 = 0b11111, b2 = 0b1111100;
uint16_t r = (b1<<8) | b2;
// debug output, the value is already composed in 16b "r" variable
std::cout << int(b1) << " " << int(b2) << " = " << int(r) << "\n";
}
输出:31 124 = 8060
(抱歉,我没有Arduino SDK验证这是可编译的,希望uint**
类型是自我规划的。)
|
是二进制或连接值,b1
首先向左移位8位(<<8
),不与b2
位重叠。
进一步编辑:是 C ++(实际上是C ++ 11)。根据需要调整到Arduino编译器。 |
和<<
运算符从一开始就是原始C的一部分,因此您必须只修复变量类型,并确保它有效。 C和C ++中的按位运算是相同的。
答案 1 :(得分:0)
如果您需要一个16位宽的变量,您可以使用例如位移。 类似的东西:
uint16_t result = SPI.transfer(...);
result <<= 8;
result |= SPI.transfer(...);