Преобразовать 4 байта в 32-битное число с плавающей запятой в CAPL?

Я хочу преобразовать сообщение CAN (4 байта) в значение с плавающей запятой.

Я читаю значение с текущего датчика и конвертирую в 4 байта, отправляю их с помощью CAN Shield в Vector CANoe. В программе Arduino преобразование значения с плавающей запятой в байты и обратно возможно с помощью Unions. В CAPL я не могу использовать союзы и указатели.

Код Arduino:

unsigned char arr[4] = {0,0,0,0};

typedef union
{
 float number;
 uint8_t bytes[4];
} floatunion;

floatunion myFloat;

myFloat.number = lowAmps; // Assign a converted current value to the float

lowRawValue = AvgSnsrData[0]; //Input Sensor Data
lowVoltage = (lowRawValue / 1024.0) * 5000; // Gets you mV
lowAmps = ((lowVoltage - ACoffset) / mVperAmp);

for (int i=0; i<4; i++)
{
     Serial.print(myFloat.bytes[i], HEX); // Print the hex representation of the float
     Serial.print(' ');
     arr[i] = myFloat.bytes[i]; //Save in unsigned char array 
}
I've tried a few from web(https://stackoverflow.com/questions/52590435/capl-converting-4-raw-bytes-into-floating-point) but nothing works well.

Также пробовал:

float test = (myFloat.bytes[3]<<24|myFloat.bytes[2]<<16|myFloat.bytes[1]<<8|myFloat.bytes[0]<<0);

Есть ли способ преобразовать это без использования объединения или указателя в CAPL / C? Есть ли встроенная функция в CAPL?

Заранее спасибо.


person Aasai    schedule 10.01.2020    source источник
comment
Как насчет memcpy?   -  person Retired Ninja    schedule 10.01.2020
comment
Как выглядит ваш код CAPL?   -  person M. Spiller    schedule 13.01.2020


Ответы (1)


Чтобы преобразовать необработанный байт в значение с плавающей запятой, вы можете использовать следующие встроенные функции:

float interpretAsFloat(dword x); // dword 4 bytes, IEEE signle precision float number
double interpretAsDouble(qword x); // qword 8 bytes, IEEE double precision float number

Примеры:

on key 'a'
{
 dword testDword=0x4048f5c3; // 3.14
 float testFloat;
 testFloat=interpretAsFloat(testDword);

 write("float  %f",testFloat);
 write("float times two  %f",testFloat*2);
}




on message ExampleCANMessage
{
  float lowAmps;

  lowAmps=interpretAsFloat(this.dword(2));// ex. your data is present on bytes 2...5 
  print("Voltage: %f ",lowAmps);
}
person YesIO    schedule 13.01.2020