浏览代码

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 年之前
父节点
当前提交
2fc5892930
共有 1 个文件被更改,包括 9 次插入9 次删除
  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);
 }