【问题标题】:How to read a float value in C on Raspberry Pi 3B from Arduino slave (via I2C)?如何从 Arduino slave(通过 I2C)在 Raspberry Pi 3B 上读取 C 中的浮点值?
【发布时间】:2018-01-05 11:18:36
【问题描述】:

我的 Arduino 从站上有一个浮点变量,我想将它发送到我的 Raspberry Pi 3 Model B 主站。我知道我可能需要从 Arduino 发送一个字节数组,然后在我的 Raspberry Pi 上正确读取它。到目前为止,我在使用 this 时运气不佳。

我不知道我应该如何阅读它,因为 WiringPi 库只提供 int 值作为回报(发送 0-255 就像一个魅力一样)。

已经完成here,但对于 Python 和 here。 C 有一组不同的 I2C 库,并且不提供 struct 之类的东西。

是否可以使用 WiringPi 从 I2C 读取字节数组并将其转换为 C 中的浮点数?

在 Arduino 上乘以数字(去掉逗号)并在 Raspberry Pi 上除以也可以,但是通过 WiringPi 发送超过 255 的问题仍然存在。

这是我在 Arduino 上发送数据的方式:

void sendData(){
  Wire.write((byte*) &floatNumber, 4);
}

以下是我在 Raspberry 上读取 8 位值 (0-255) 的方法(例如,Wire.write(129)):

int fd;
int data;
wiringPiSetup();

fd=wiringPiI2CSetup(0x04);

data=wiringPiI2CRead(fd);

ui->lcdNumber->display(data);

【问题讨论】:

  • 你的 PI 代码正在读取一个 int,我认为这是 PI 上的 32 位,所以你应该能够将它转换为浮点数并且它可能会工作。 ui->lcdNumber->display((float)data);
  • 浮点数没有什么特别之处,它只是一组位,你能将一组位从一个平台移动到另一个平台吗?然后,C语言是C语言,无论您的编译器是否有效,都可以使用C语言,这部分问题与芯片或平台无关(浮点数只是您操作的位的集合) .
  • 就像我写的那样,到目前为止,我只成功地移动了 8 位(使用给定的代码),而且我的代码(可能在 Raspberry Pi 端)中缺少一些东西来移动 32 位。跨度>

标签: c arduino raspberry-pi i2c wiringpi


【解决方案1】:

您可以在传输之前将浮点值转换为 ASCII 表示的浮点值(字符串),并将浮点值(字符串)的 ASCII 表示转换回 Raspberry Pi 3 上的浮点数。

【讨论】:

  • 由于float 两端的表示和/或字节顺序可能不同,这是最好的!您不想在低级代码上浪费时间以在字节级别进行这些转换。
  • 但是如果我以后想在 Rpi 上使用这个变量怎么办?将字符串转换回 Rpi 端的浮点数?
  • 另外,发送一个字符串超过 8 位(0-255),这需要我发送一个字节数组,就像我需要转换浮点数一样,对吧?
  • 要将float 转换为字符串,我建议使用sprintf(buf, "%a", value);sprintf(buf, "%.*e", FLT_DECIMAL_DIG - 1, value); Details
  • @VapeKop,您将不得不通过 I2C 总线发送更多数据,但这种方法可以保证数据的准确性和稳定性。您不必担心低级别的复杂性。在 Raspberry Pi 上接收数据时,您可以将此字符串转换回浮点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多