Я пытаюсь отправить кватернионы (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