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.