This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Best way to send float over BLE

What is the Best way to send float over BLE?

Values range between -2.000volt and +2.000Volt (-2000mV / +2000mV) Do I break it into two uint8_t and manipulate the +/- sign in separate 8-bit byte?

I took the ble_sdk_app_proximity example, and commented out what I do not need. Then used the examples from the tutorials, to add three services. So I added x3 services, based on the BLE Characteristics, a beginner's tutorial, and it is working fine. (nrf5-ble-tutorial-characteristic-CompletedCode ported for SDK 13.zip)

So I need to send the Voltage either as a float, or manipulate it to look like uint8_t, and keep track of the sign.

Any help appreciated.

  • Hi. Normally there are no floats in digital system. Unless you really really really need to work with that because of sealed protocol specification just use native representation of that "type", transport it and represent only on the final system where it needs to appear as float (GUI of mobile app, back end API/database...)

    So you get voltage as some digital sample of certain bit length (e.g. 14-bit sample by SAADC peripheral on nRF52), probably align it to next 8-bit byte (because BLE Link layer or any higher protocol is byte-oriented) and just send it to the other side.

  • OK. Thanks. I will send 8-bit bytes, and track the sign. So it seems one will send say 3 bytes to represent -1999 (0x7CF) [mV] 2 bytes for the value and 1-byte for the sign. Then let the Client compute (if needed) say -1.999V Rather than let the nRF52 calculate and track the decimal point, the sign, and the 2-byte value. Makes sense.

  • You can use this function that encodes a float (32 bits) into a uint8_t buffer

    bds_float_encode(&float_data, encoded_buffer)
    

    A float after all is just 4 bytes of data.

    The definition of the function is in this file

    ./sdk/components/libraries/util/app_util_bds.h
    
    static __INLINE uint8_t bds_float_encode(const float_t * p_value, uint8_t * p_encoded_data){
    union { 
        float float_val;
        uint8_t char_val[4];
    }encoder;
    
    encoder.float_val = *p_value;
    p_encoded_data[0] = encoder.char_val[0];
    p_encoded_data[1] = encoder.char_val[1];
    p_encoded_data[2] = encoder.char_val[2];
    p_encoded_data[3] = encoder.char_val[3];
    return(4);}
    

    .

  • Thanks ypearson I found the .h file, but no bds_float_encode function.

    Is this in an older SDK. I searched SDK 11, 12 and SDK13, but did not find a bds_float_encode function

  • I added the code, so you can just copy and paste it. I'm using SDK12.2. Yvan Pearson

Related