我想将浮点数转换为两个16位整数。 我写的代码如下:
float floatCurrentVolume = 1234.50;
uint32_t ui32TemperaryVariable1;
uint16_t ui8ModbusRegister[2] = {0};
ui32TemperaryVariable2 =(uint32_t ) floatCurrentVolume;
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume && 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) && 0x0000FFFF);
基本上floatCurrentVolume应分成两个16位寄存器。 但是当我检查输出时,我得到ui8ModbusRegister [0] = 0,ui8ModbusRegister [1] = 1。 代码有什么问题??
答案 0 :(得分:3)
您有&&
和&
字符的错误用例。第一种情况是逻辑AND ,结果可能是1
或0
,而第二种情况是按位AND ,这就是您要查找的内容。
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume && 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) && 0x0000FFFF);
应该是
// |--here
ui8ModbusRegister[0] = (uint16_t )(floatCurrentVolume & 0x0000FFFF);
ui8ModbusRegister[1] = (uint16_t )((ui32TemperaryVariable3 >> 16) & 0x0000FFFF);
// |--here
如果你想真正发送整个浮动数(包括小数),那么你必须复制如下的内存:
//Copy float to modbus register
memcpy(ui8ModbusRegister, &floatCurrentVolume, sizeof floatCUrrentVolume);
//And then on receive side, copy it back before read
memcpy(&floatCurrentVolume, ui8ModbusRegister, sizeof floatCUrrentVolume);
答案 1 :(得分:1)
最便携的方法是将浮点数复制到字节级别的uint_t。任何其他方式一次涉及未定义的行为或更糟糕的可能使用浮点数截断。例如,ui32TemperaryVariable2 =(uint32_t ) floatCurrentVolume;
将ui32TemperaryVariable2
设置为1234
,这不应该是您所期望的。
正确的方法是:
memcpy(ui8ModbusRegister, &floatCurrentVolume, sizeof(ui8ModbusRegister));
这样可以正确存储ui8ModbusRegister[0]
中的高位16位字和ui8ModbusRegister[1]
中的低位字。
答案 2 :(得分:0)
也许直接深刻的副本会更好?
float floatCurrentVolume = 1234.50;
uint16_t ui8ModbusRegister[2];
memcpy(ui8ModbusRegister, &floatCurrentVolume, 4);