boj*_*vic 0 c freepascal arduino raspberry-pi
美好的一天,
我在Master(Raspberry pi 2B,使用Lazarus)和Slave - Arduino Nano之间进行I2C通信.在Arduino我定义了
typedef union
{
float Temperature;
uint8_t bytes[4];
} floatuint;
floatuint fu;
Run Code Online (Sandbox Code Playgroud)
我已经定义了覆盆子pi
TFloatUint = packed record
case Boolean of
False: (dabDouble: Double);
True: (dabByte: packed array[0..3] of cuint8);
end;
Run Code Online (Sandbox Code Playgroud)
使用命令
count := FpRead(I2DeviceHandle, fl.dabByte, 4);
Run Code Online (Sandbox Code Playgroud)
我收到字节数组的相同值,但fl.dabDouble显示不同的结果.
例如:
fu.Temperature = 19.19;
fu.bytes = (0, 128, 153, 65);
fl.dabByte = (0, 128, 153, 65);
fl.dabDouble = 2.6656892163191751e-314
Run Code Online (Sandbox Code Playgroud)
我犯了哪个错误?
Doublepascal中的大小为8个字节.使用Single4个字节.
TFloatUint = packed record
case Boolean of
False: (dabSingle: Single);
True: (dabByte: packed array[0..3] of cuint8);
end;
Run Code Online (Sandbox Code Playgroud)
C float是4字节单精度浮点类型.Pascal Double是8字节双精度.换句话说,你使用了错误的类型.它应该是:
TFloatUint = record
case Boolean of
False: (Temperature: Single);
True: (bytes: array[0..3] of cuint8);
end;
Run Code Online (Sandbox Code Playgroud)
另请注意,您不应打包记录.并不是说它对布局有任何影响,但会导致类型具有错误的对齐值.我认为没有理由打包阵列.
由于我不知道的原因,世界各地的Pascal程序员似乎倾向于想要打包不应该打包的东西.