如何通过uint8_t数据发送int?

时间:2014-07-05 16:08:06

标签: string pointers arduino int uint8t

我使用airspayce.com的RadioHead Packet Radio库。在示例(nrf24_reliable_datagram_client& server)中,它们让两个节点通过来回发送字符串相互通信。现在我想在那里发送一个int而不是一个字符串,并对这些数据做一些事情。这就是他们在示例中所做的事情:

定义buf字节。

uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

此功能接收数据:

manager.recvfromAckTimeout(buf, &len, 500, &from)

打印buf变量。

Serial.print((char*)buf);

到目前为止一直很好。现在我想做点什么:

int value = (char*)buf;

或者:

char value[10] = { (char*)buf };

但后来我得到了:

invalid conversion from 'char*' to 'int' (or to 'char'...)

接下来,在我发送数据的另一边,我有:

uint8_t data[] = { analogRead(A0) };

当我在接收方打印这些数据时,使用第一个问题的代码,我会得到奇怪的字符。所以我想,让我们试试:

Serial.print((char*)buf, DEC); // or BYTE

但后来我得到了:

call of overloaded 'print(char*, int)' is ambiguous

我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:0)

你不能只是将一个数组分配给一个整数,并希望它为你合并元素 - 例如,它如何知道如何合并它们?

要将uint16_t转换为uint8_t [2]数组,您可能需要执行以下操作:

uint16_t analog = analogRead(A0); //read in as int.
uint8_t data[2] = {analog, (analog >> 8)}; // extract as {lower byte, upper byte)
Serial.write(data,2); //write the two bytes to the serial port, lower byte first.

您可以通过其他方式执行此操作,例如使用uint16_t与两个uint8_t的数组的并集,但上述方式更具可移植性。您也可以通过键入指向int的类型来执行此操作,但是如果一端使用big endian而另一端使用little endian,那么除非您在接收数据时在数组中翻转数据,否则这将无效。

对于接收方端,您将拥有:

uint8_t data[2];
...
... //whatever you do to receive the bytes that were sent over serial.
...
//Now assuming that data[] contains the received bytes where:
//data[0] was the first in (lower byte) and data[1] was the second in (upper byte)
uint16_t merged = (data[1] << 8) | data[0]; //merge them back together

希望这有帮助。

此外,'重载原型'表示不存在采用该特定输入变量集的函数。从印刷类标题中你会发现有这个原型:

write(const uint8_t *buffer, size_t size);

做你想做的事 - 从数组中打印指定数量的uint8_t。