【问题标题】:C to Pascal type conversionC 到 Pascal 类型转换
【发布时间】: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


【解决方案1】:

Double 的大小为 8 个字节,单位为帕斯卡。使用Single,即4个字节。

TFloatUint = packed record
   case Boolean of
     False: (dabSingle: Single);
     True: (dabByte: packed array[0..3] of cuint8);
 end;

【讨论】:

  • 是的,这就是解决方案。谢谢。
【解决方案2】:

C float 是 4 字节单精度浮点类型。 Pascal Double 是 8 字节双精度。换句话说,您使用了错误的类型。应该是:

TFloatUint = record
   case Boolean of
     False: (Temperature: Single);
     True: (bytes: array[0..3] of cuint8);
 end;

还请注意,您不应该打包唱片。并不是说它对布局有任何影响,但它会导致类型具有错误的对齐值。而且我也认为没有理由打包阵列。

出于我不知道的原因,世界各地的 Pascal 程序员似乎倾向于打包不应该打包的东西。

【讨论】:

  • 是的,这就是解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2012-05-10
  • 2011-01-22
相关资源
最近更新 更多