2017-06-16 219 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); 
相關問題