Лучший способ отправить значения с плавающей точкой через BLE - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь отправить кватернионы (4 значения с плавающей запятой) через BLE клиенту в одной характеристике Bluetooth c. Моя задача - найти самый быстрый и наименее вычислительный способ передачи этих данных.

До сих пор я использовал sprintf() для объединения значений с плавающей точкой и выводил их sh в setValue(), но я не смог декодировать выходные байты на стороне клиента. Я думал о том, чтобы отправить значения как int, а затем проанализировать их, чтобы они всплыли на стороне клиента. Что бы вы посоветовали как лучшее решение?

Код на стороне сервера:

 if (deviceConnected) {

    readQuatData(BNO055_quatCount);

        BNO055_quat[0] = (float)(BNO055_quatCount[0]) / 16384.;
        BNO055_quat[1] = (float)(BNO055_quatCount[1]) / 16384.;
        BNO055_quat[2] = (float)(BNO055_quatCount[2]) / 16384.;
        BNO055_quat[3] = (float)(BNO055_quatCount[3]) / 16384.;

sprintf(myConcatenation, "%3.2f %3.2f %3.2f %3.2f", BNO055_quat[0] , BNO055_quat[1], BNO055_quat[2], BNO055_quat[3]);

pCharacteristic->setValue(myConcatenation);

      pCharacteristic->notify(); // Send the value to the app!
}

Возможные входные данные для функции SetValue():

void BLECharacteristic::setValue(std::string value) {
        setValue((uint8_t*)(value.data()), value.length());
} // setValue

void BLECharacteristic::setValue(uint16_t& data16) {
    uint8_t temp[2];
    temp[0] = data16;
    temp[1] = data16 >> 8;
    setValue(temp, 2);
} // setValue

void BLECharacteristic::setValue(uint32_t& data32) {
    uint8_t temp[4];
    temp[0] = data32;
    temp[1] = data32 >> 8;
    temp[2] = data32 >> 16;
    temp[3] = data32 >> 24;
    setValue(temp, 4);
} // setValue

void BLECharacteristic::setValue(int& data32) {
    uint8_t temp[4];
    temp[0] = data32;
    temp[1] = data32 >> 8;
    temp[2] = data32 >> 16;
    temp[3] = data32 >> 24;
    setValue(temp, 4);
} // setValue

 void BLECharacteristic::setValue(float& data32) {
    uint8_t temp[4];
    *((float*)temp) = data32;
    setValue(temp, 4);
} // setValue

void BLECharacteristic::setValue(double& data64) {
    uint8_t temp[8];
    *((double*)temp) = data64;
    setValue(temp, 8);
} // setValue
...