【发布时间】:2016-11-18 11:51:19
【问题描述】:
早安,
我致力于主设备(Raspberry pi 2B,使用 Lazarus)和从设备 - Arduino Nano 之间的 I2C 通信。 在 Arduino 上我已经定义了
typedef union
{
float Temperature;
uint8_t bytes[4];
} floatuint;
floatuint fu;
在树莓派上我已经定义了
TFloatUint = packed record
case Boolean of
False: (dabDouble: Double);
True: (dabByte: packed array[0..3] of cuint8);
end;
使用命令
count := FpRead(I2DeviceHandle, fl.dabByte, 4);
我收到相同的字节数组值,但 fl.dabDouble 显示不同的结果。
例如:
fu.Temperature = 19.19;
fu.bytes = (0, 128, 153, 65);
fl.dabByte = (0, 128, 153, 65);
fl.dabDouble = 2.6656892163191751e-314
我哪里做错了?
【问题讨论】:
-
不要依赖特定的数据格式。而是定义一种通用的交换格式(ASCII 仍然是浮点的最佳选择)并为双方编写序列化函数/过程。但一般来说,您不会在像 Arduino(包括 Cortex-M 变体)这样的小型 MCU 上使用浮点。通过整数使用定点或分数仿真。这样转换就容易多了。
-
如您所见,通信使用字节进行。
标签: c arduino raspberry-pi freepascal