2016-11-18 3 views
0

Bonne journée,C à la conversion de type Pascal

Je travaille sur la communication I2C entre le maître (Raspberry Pi 2B, en utilisant Lazarus) et esclave - Arduino Nano. Sur Arduino j'ai défini

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

Sur Raspberry Pi J'ai défini

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

Utilisation de la commande

count := FpRead(I2DeviceHandle, fl.dabByte, 4); 

Je reçois les mêmes valeurs pour tableau d'octets, mais fl.dabDouble montre différents résultat.

Par exemple:

fu.Temperature = 19.19; 
fu.bytes = (0, 128, 153, 65); 

fl.dabByte = (0, 128, 153, 65); 
fl.dabDouble = 2.6656892163191751e-314 

Là où je fait une erreur?

+2

Ne comptez pas sur un format de données spécifique. Au lieu de cela, définissez un format d'échange commun (ASCII est toujours le meilleur pour les virgules flottantes) et écrivez les fonctions/procédures de sérialisation pour les deux côtés. Mais en général, vous n'utilisez pas de point flottant sur de tels petits MCU comme Arduino (inclut les variantes Cortex-M). Utilisez l'émulation à virgule fixe ou fractionnaire via des entiers. De cette façon, la conversion est beaucoup plus facile. – Olaf

+0

Comme vous pouvez le voir, la communication utilise des octets. –

Répondre

7

Double est de 8 octets en pascal. utilisez Single qui est de 4 octets.

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

Oui, c'est une solution. Merci. –

5

C float est un type à virgule flottante simple précision de 4 octets. Pascal Double est une double précision de 8 octets. Vous avez utilisé le mauvais type en d'autres termes. Il devrait être:

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

Notez également que vous ne devriez pas emballer l'enregistrement. Ce n'est pas que cela a un impact sur la mise en page, mais cela conduira au type ayant la mauvaise valeur d'alignement. Et je ne vois aucune raison d'emballer le tableau non plus.

Pour des raisons que je ne connais pas, les programmeurs Pascal du monde entier ont tendance à vouloir emballer des choses qui ne devraient pas être emballées.

+0

Oui, c'est une solution. Merci. –