2016-04-11 40 views
1

Modbus TCP üzerinden iletişim kuran bir C programı yazıyorum. 3.14 şamandıranı 0x4048F5C3'un onaltılık gösterimi ile modbus istemcim üzerine gönderirim. C kodum modbus paketini doğru bir şekilde alıyor ve şimdi unsigned char *buffer'u bir float olarak yeniden yorumlamam gerekiyor, böylece 3.14 değerini alabilirim.Float olarak yeniden yorumlanırken endianness belirleyebilir miyim?

{ 0xC3, 0xF5, 0x48, 0x40 }; 

sonra her şey iyi çalışır: Burada tampon şöyle görünür böylece endianness'ın takas çünkü eğer ben, bu sorun nedeniyle endian ait olduğunu söyleyebilir, Şimdi benim kod

int main() 
{ 
    setup_modbus_tcp(); 
    unsigned char buffer[4] = { 0x00, 0x00, 0x00, 0x00 }; 
    get_modbus_data(buffer, 4); 
     //Buffer now holds { 0x40, 0x48, 0xF5, 0xC3 }; 
    float value = *(float *)buffer; 
     //value is now -490.564453 
} 

olduğunu. Ama bu biraz dağınık hissediyor. Endensitimi değiştirmek zorunda mıyım?

tampon elle ele alınması gerekir
float value = *(float *)buffer; 
+0

Ya tüm bayt takas zorunda veya basılı bir ASCII dizesi olarak şamandıra gönderin: hafıza tipi float bir nesneye kopyalanması gerekir. –

+0

Bayt değiştirmeden sonra bile: Temsilin aynı olduğuna emin misiniz? – Olaf

+0

@Olaf Evet, bayt değiştirdikten sonra, kesinlikle doğru. Kayan nokta hassasiyeti nedeniyle küçük bir fark vardır, ancak bunun dışında doğru. – DJMcMayhem

cevap

2

, bu endianness'ın değişiklikleri içerir: Ya ben ne zaman ben endianness'ın belirtebilirsiniz bir yolu yoktur. Arabelleği kayan nokta biçimine dönüştüren her zaman bir işlev kullanılabilir.


float value = Convert(buffer); 

tampon dönüştürme, bu arada eklemek için yanlış: tanımsız bir davranışa neden işaretsiz karakterlerin

float value = *(float *)buffer; 

bir dizi, bir float türüne sadece olamaz.

float value; 
memcpy(&value , buffer , sizeof(value)); //assumes endianness has already been handled