2017-06-16 172 views
-2

我想将浮点数转换为两个16位整数。 我已经写的代码如下给出:将浮点数转换为C中的两个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。 代码有什么问题?

+6

__C__'!='__C++ __'!='__C__,它们是不同的语言,需求被视为这样。 :)选择一个,坚持下去。 –

+1

请使用Ctrl + K或使用四个空格缩进来正确缩进代码。另外,C和C++是两种不同的语言,请选择一种。这看起来像它虽然是C虽然 – Badda

+0

'#ifdef __cplusplus'' #error C++编译器''#endif' – pmg

回答

3

您错误地使用了&&&字符。第一种情况是逻辑AND,结果可能是10,而第二种情况是按位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); 
+0

这可能不是唯一的问题。如果他希望在2个modbus寄存器上有浮点数值'ui32TemperaryVariable2 =(uint32_t)floatCurrentVolume;'也应该用'memcpy'替换。 – user694733

+0

@ user694733这是真的,但从他的角度来看,他希望它是整数。如果是整个float,那么我同意你的说法,'memcpy'是必需的。 – tilz0R

+0

我怀疑他只说他想转换为整数,因为modbus协议不支持开箱即用。它们通常使用按位复制到2个16位寄存器来实现。 – user694733

1

最可移植的方式是将float复制到字节级别的uint_t中。任何其他方式最终都会涉及未定义的行为,或者更糟的是可能会使用float来进行int截断。例如ui32TemperaryVariable2 =(uint32_t) floatCurrentVolume;ui32TemperaryVariable2设置为1234,这不应该是您所期望的。

正确的方法是:

memcpy(ui8ModbusRegister, &floatCurrentVolume, sizeof(ui8ModbusRegister)); 

这正确地存储在ui8ModbusRegister[0]的高位16位字和低位一个在ui8ModbusRegister[1]

0

也许直接深拷贝会更好?

float floatCurrentVolume = 1234.50; 
uint16_t ui8ModbusRegister[2]; 
memcpy(ui8ModbusRegister, &floatCurrentVolume, 4); 
相关问题