微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解码 Ble 数据原始抖动

如何解决解码 Ble 数据原始抖动

我正在使用 Flutter_blue 库开发 Flutter 应用程序,以连接 STMicroelectronics 的 BlueNRG-tile。我正在接收来自所需特征的原始数据,然后我注意到能够使用 utf8.decode() 函数将它们转换为字符串。

这是接收到的数据列表和问题。

I/Flutter (32277): Teste conversion : [121,85,209,133,1,5,10,237,0]
E/Flutter (32277): [ERROR:Flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: FormatException: Missing extension byte (at offset 11).

st 板中的代码

tBleStatus Environmental_Update(int32_t Press,int32_t Press2,uint16_t Hum,int16_t Temp,int16_t Temp2) {
    uint8_t BuffPos = 0;

    STORE_LE_16(buff,(getTimestamp()));
    BuffPos = 2;

    STORE_LE_32(buff + BuffPos,Press);
    BuffPos += 4;

    STORE_LE_16(buff + BuffPos,Hum);
    BuffPos += 2;

    STORE_LE_16(buff + BuffPos,Temp);
    BuffPos += 2;
    STORE_LE_16(buff + BuffPos,Temp2);
    

    return aci_gatt_update_char_value(HWServW2STHandle,EnvironmentalCharHandle,EnvironmentalCharSize,buff);

}

Environmental_Update(PresstoSend,PresstoSend2,HumToSend,TempToSend,TempToSend2);

谢谢。

解决方法

您无法将 RAW 数据转换为字符串,因为您不是将其作为字符串发送,而是以字节形式发送。

以您的体温为例: 您收到的温度是 int16_t,这是一个 16 位数字,存储从 –32768 到 32767 的值。这个数字需要存储两个字节,这就是您使用 BuffPos += 2; 并将位置增加 2 个字节的原因。

您需要以相同的方式从接收到的数组中提取值,逐字节。看看这个例子:

import 'dart:typed_data';

int fromBytesToInt16(int b1,int b0) {
    final int8List = new Int8List(2)
      ..[1] = b1
      ..[0] = b0;
  
    return ByteData.sublistView(int8List).getInt16(0);
}

void main() {
    var received = [121,85,209,133,1,5,10,237,0];
    var temp = fromBytesToInt16(received[8],received[9]) / 100;
    print('temperature: $temp');
}

温度以 int16 形式存储在索引 8 和 9 处,因此我以相同的方式对其进行了转换。这导致 temp 值为 2565,除以 100 会得到 25.65 度的相当不错的温度

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。