2016-11-18 7 views
0

Хорошего дня,С до преобразования типа Pascal

я работать на I2C связи между Мастерами (малина пи 2В, с использованием Lazarus) и ведомым - Arduino Nano. На Arduino я определил

typedef union 
{ 
    float Temperature; 
    uint8_t bytes[4]; 
} floatuint; 
floatuint fu; 

На Raspberry Pi я определил

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 

Где я допустил ошибку?

+2

Не полагайтесь на определенный формат данных. Вместо этого определите общий формат обмена (ASCII по-прежнему лучше всего подходит для с плавающей запятой) и записывайте функции/процедуры сериализации для обеих сторон. Но в целом вы не используете плавающие точки на таких небольших микроконтроллерах, как Arduino (включая варианты Cortex-M). Используйте фиксированную или дробную эмуляцию с помощью целых чисел. Таким образом, преобразование намного проще. – Olaf

+0

Как вы можете видеть, связь идет с использованием байтов. –

ответ

7

Double 8 байт в паскале. используйте Single, который составляет 4 байта.

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

Да, это решение. Благодарю. –

5

С float представляет собой 4 байта одинарной точности типа с плавающей точкой. Pascal Double 8 байт двойной точность. Вы использовали неправильный тип, другими словами. Это должно быть:

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

Обратите также внимание на то, что вы не должны упаковывать запись. Не то, чтобы это повлияло на макет, но это приведет к тому, что тип имеет неправильное значение выравнивания. И я не вижу причин собирать массив.

По неизвестным мне причинам, программисты Pascal, похоже, имеют тенденцию хотеть упаковывать вещи, которые не должны быть упакованы.

+0

Да, это решение. Благодарю. –