如何连接arduino c中的传入字节

时间:2016-08-24 18:36:50

标签: arduino spi

我试图从SPI传感器获取两个字节并连接它们(不添加它们或按位或它们)。我有:11111和1111100.我想要的:0001111101111100(十进制8060)。

当我的Serial.print(firstByte,BIN)我的两个字节时,Arduino似乎删除了前导0(可能是因为正在进行某种转换而且那些0'没有贡献数字或某物的价值)。

这对我来说是一个问题,因为在将这个双字节二进制数转换为十进制整数之前,我想连接这两个字节,包括前导0。

有谁知道一个好的方法?我想将它们存储为char数组,但不确定。在上面的例子中,我可以手动添加一个' 0'但是,如果这些比特值永远不会改变,那真的只会起作用,这将是一个问题。

以下是我的参考代码: https://gist.github.com/vwls/852fb5c53112efc77faaecd6bffba25f

任何建议都会非常有用!

2 个答案:

答案 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(...);