Преобразовать тип с плавающей запятой в два коротких (старший и младший байты) - PullRequest
0 голосов
/ 22 января 2019

Я передаю данные через последовательный порт. на стороне декодирования. Я кодирую на передающей стороне следовать кодам от принимающей стороны Я должен кодировать данные из типа с плавающей запятой (4 байта) в верхнюю и нижнюю части (короткий тип), а затем передавать их.

У меня был код декодирования. Что я должен сделать на стороне кодирования.

Я пытался конвертировать signed int si из float realSi, но это было неправильно. Я получил значение 0 signed int si. ниже код декодирования.

unsigned short siH = msg->getDataWordArray()[1]
unsigned short siL = msg->getDataWordArray()[2]
signed int si = (siH << 16) | (siL & 0x0000ffff)
float realSi = (float)((float)si)*180/1073741824);

1 Ответ

0 голосов
/ 22 января 2019

Один из способов сделать это - использовать объединение, как показано в приведенном ниже примере кода.Имейте в виду, что это будет работать только в том случае, если компьютеры на обеих сторонах последовательного соединения используют один и тот же формат с плавающей запятой и один и тот же порядковый номер.Если это не так, вам нужно будет добавить дополнительную логику перевода для обработки этих различий.

#include <stdio.h>

union Foo
{
   unsigned short asShorts[2];
   float asFloat;
};

int main(int, char * *)
{
   // Convert a float into two shots
   Foo foo;
   foo.asFloat = 3.14159f;
   printf("For float value %f, the shorts are %u and %u\n", foo.asFloat, foo.asShorts[0], foo.asShorts[1]);

   // [... send the two asShorts values across the serial port here...]


   // Imagine this is the receiving-side code (after having received the two shorts)
   const unsigned short s1 = foo.asShorts[0];
   const unsigned short s2 = foo.asShorts[1];

   // Convert the two shorts back into a float
   Foo bar;
   bar.asShorts[0] = s1;
   bar.asShorts[1] = s2;
   printf("For shorts %u and %u, the float value is %f\n", s1, s2, bar.asFloat);


   return 0;
}

... кстати, если вы предпочитаете отправлять / получать байты, а не шорты, вы можетевместо этого измените объединение так:

union Foo
{
   unsigned char asBytes[4];
   float asFloat;
};
...