From 2fc589293066d934bfdfbdff320574e1ea2f5c8a Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Tue, 30 Mar 2010 10:43:10 +0200 Subject: [PATCH] Implement the register <-> float conversion without breaking aliasing rules. --- src/modbus.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index 9edf434..1b66b70 100644 --- a/src/modbus.c +++ b/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); } -- libgit2 0.21.4