Jelajahi Sumber

Implement the register <-> float conversion without breaking aliasing rules.

The previous implementation dereferenced a type-puned pointer, which is
illegal according to ANSI C. Some newer versions of GCC will complain
about this. This implementation uses "memcpy" to avoid this problem.
Florian Forster 15 tahun lalu
induk
melakukan
2fc5892930
1 mengubah file dengan 9 tambahan dan 9 penghapusan
  1. 9 9
      src/modbus.c

+ 9 - 9
src/modbus.c

@@ -1988,20 +1988,20 @@ uint8_t get_byte_from_bits(const uint8_t *src, int address, int nb_bits)
 /* Read a float from 4 bytes in Modbus format */
 float modbus_read_float(const uint16_t *src)
 {
-        float real;
-        uint32_t ireal = (src[1] << 16) + src[0];
-        real = *((float *)&ireal);
+        float r = 0.0f;
+        uint32_t i;
 
-        return real;
+        i = (((uint32_t) src[1]) << 16) + src[0];
+        memcpy (&r, &i, sizeof (r));
+        return (r);
 }
 
 /* Write a float to 4 bytes in Modbus format */
 void modbus_write_float(float real, uint16_t *dest)
 {
-        uint32_t ireal;
+        uint32_t i = 0;
 
-        ireal = *((uint32_t *)&real);
-        /* Implicit mask 0xFFFF */
-        dest[0] = ireal;
-        dest[1] = ireal >> 16;
+        memcpy (&i, &real, sizeof (i));
+        dest[0] = (uint16_t) i;
+        dest[1] = (uint16_t) (i >> 16);
 }