Hi,
I'm sending data from the serial port of my cr1000 to a lora node.
So, i must use serialOutblock to send data in binary format FP2.
I can't send data in 4 bytes (IEEE) because it's to large for the bandwith off LoraWan communications.
The receiver need to convert datas into float for storage them in database .
How can i convert FP2 CSI format to float ?
I have just this information 1 sign bit , 2 bit for exponent and 13 bit for mentissa from campbell user manuel.
I try the formula from IEEE 754 but no good result!!
Best regards
The FP2 format uses base 10 instead of base 2. Here is a sample of my code that performs this conversion:
typedef unsigned char byte; typedef unsigned short uint2; float csiFs2ToFloat(void const *buff_) { // we are going to cast the binary value into a two byte integer so that it is convenient to pick // out patterns and pick off parts of the structure. byte const *buff = static_cast(buff_); uint2 fs_word = (uint2(buff[0]) << 8) + buff[1]; // we can now pick off the components of the FS2 structure static uint2 const pos_infinity = 0x1fff; static uint2 const neg_infinity = 0x9fff; static uint2 const not_a_number = 0x9ffe; bool is_negative = ((fs_word & 0x8000) != 0); uint2 mantissa = fs_word & 0x1FFF; uint2 exponent = (fs_word & 0x6000) >> 13; double rtn; if(fs_word == pos_infinity) rtn = std::numeric_limits::infinity(); else if(fs_word == neg_infinity) rtn = -1.0f * std::numeric_limits::infinity(); else if(fs_word == not_a_number) rtn = std::numeric_limits::quiet_NaN(); else { rtn = static_cast(mantissa); for(uint2 i = 0; mantissa != 0 && i < exponent; ++i) rtn /= 10.0f; if(is_negative && mantissa != 0) rtn *= -1.0f; } return static_cast(rtn); } // csiFs2ToFloat
Note that this code is in C++.
This post is under review.
The FP2 binary format is described in the CR1000 manual. It is on page 585.