按位运算符并将int转换为2个字节并再次返回

时间:2010-06-13 07:24:16

标签: c++ bit-manipulation arduino openframeworks

第一次用户,大家好!

所以希望有人可以提供帮助.. 我的背景是php所以输入低端的东西,比如,char是字节,这是位...这是二进制值..等等需要一些时间才能得到好处;)

我在这里尝试做的是从Ardunio板发送一些值到openFrameWorks(都是c ++)。

当被要求发送数据时,此脚本当前所做的事情(并且适用于我可能添加的一个传感器)是..

int value_01 = analogRead(0);  // which outputs between 0-1024

 unsigned char val1;
 unsigned char val2;

//some Complicated bitshift operation           
    val1 = value_01 &0xFF;
    val2 = (value_01 >> 8) &0xFF;  

    //send both bytes
    Serial.print(val1, BYTE);
    Serial.print(val2, BYTE);

显然,这是获取数据的最可靠方式.. 所以现在通过串口发送,字节被添加到char字符串并由...转换回来。

int num = ( (unsigned char)bytesReadString[1] << 8 | (unsigned char)bytesReadString[0] );

所以回顾一下,我试图获得4个传感器的数据(我假设这些序列中有8个?)并且在它的末尾有int num_01 - num_04 ....

我假设这个(与大多数事情一样)对于有这些概念经验的人来说可能很容易..

非常感谢任何帮助。 感谢

4 个答案:

答案 0 :(得分:7)

编写一个函数来抽象发送数据(我已经删除了你的临时变量,因为它们没有增加太多的值):

void send16(int value)
{
    //send both bytes
    Serial.print(value & 0xFF, BYTE);
    Serial.print((value >> 8) & 0xFF, BYTE);
}

现在您可以轻松发送所需的任何数据:

send16(analogRead(0));
send16(analogRead(1));
...

答案 1 :(得分:1)

一个接一个地发送它们。

请注意,串行驱动程序允许您一次发送一个字节(8位)。 0到1023之间的值(看起来像你得到的)适合10位。所以1个字节是不够的。 2个字节,即16位就足够了(有一些额外的空间,但除非传输速度有问题,否则你不必担心这个浪费的空间)。

因此,前两个字节可以携带第一个传感器的数据。接下来的两个字节携带第二个传感器的数据,第三个传感器的后两个字节,以及最后一个传感器的最后两个字节。

我建议您使用R Samuel Klatchko在发送方提出的功能,希望您能在接收方找到您需要做的事情。

答案 2 :(得分:0)

   int num = ( (unsigned char)bytesReadString[1] << 8 | 
               (unsigned char)bytesReadString[0] );

该代码无法满足您的期望。

当你移动一个8位无符号字符时,你会丢失额外的位。

11111111 << 3 == 11111000

11111111 << 8 == 00000000

即。任何unsigned char,当移位8位时,必须为零。

你需要更像这样的东西:

typedef unsigned uint;
typedef unsigned char uchar;

uint num = (static_cast<uint>(static_cast<uchar>(bytesReadString[1])) << 8 ) |
           static_cast<uint>(static_cast<uchar>(bytesReadString[0]));

您可能会得到相同的结果:

typedef unsigned short ushort;
uint num = *reinterpret_cast<ushort *>(bytesReadString);

如果字节顺序正常。应该使用Little Endian(x86或x64),但不适用于Big Endian(PPC,Sparc,Alpha等)

答案 3 :(得分:0)

稍微概括一下“发送”代码 -

void SendBuff(const void *pBuff, size_t nBytes)
{
    const char *p = reinterpret_cast<const char *>(pBuff);
    for (size_t i=0; i<nBytes; i++)
        Serial.print(p[i], BYTE);
}

template <typename T>
void Send(const T &t)
{
    SendBuff(&t, sizeof(T));
}