第一次用户,大家好!
所以希望有人可以提供帮助.. 我的背景是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 ....
我假设这个(与大多数事情一样)对于有这些概念经验的人来说可能很容易..
非常感谢任何帮助。 感谢
答案 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));
}