【问题标题】:How to send an int over uint8_t data?如何通过 uint8_t 数据发送 int?
【发布时间】:2014-08-26 14:46:41
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • 你做错了类型转换。例如,要从缓冲区转换为指向char 的指针,然后期望它神奇地转换为int。进行这种转换的适当方法是int value = * ( (int*)buf ); - 注意结果指针的取消引用以获得它指向的值
  • 好读的是 wiki 字节序。这是一个老问题。

标签: string pointers arduino int uint8t


【解决方案1】:

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

要将 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 来实现,但是如果一端使用大端,另一端使用小端,则除非您在接收数据时翻转数组中的数据,否则这将不起作用。

对于接收端,您将拥有:

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。

【讨论】:

  • 哇,谢谢。很好的解释!在将代码发送到这里之前,我已经看了好几个小时,但我必须承认我犯了一个非常基本的错误。出于某种原因,我不明白 uint8_t buf[] 实际上是一个数组,我可以这样做:int oneValue = buf[0]; 来获取其中一个值。最后,这正是我想要的。因为 * 的事情我很困惑,并认为我必须用指针做一些事情......
  • 你正在用指针做一些事情:oneValue = buf[0]; 是一个很好的简写形式:oneValue = *(buf+0);,所以当你访问一个数组时,你所做的就是在距离指针给定的偏移量处寻找元素到数组(这也是索引为零索引的原因)。
猜你喜欢
  • 2023-04-02
  • 2017-08-28
  • 1970-01-01
  • 2013-12-16
  • 2018-08-17
  • 1970-01-01
  • 2017-04-18
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多