0

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

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

I/flutter (32277): Teste conversion : [121, 85, 0, 0, 209, 133, 1, 0, 5, 10, 237, 0, 0, 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, 0, EnvironmentalCharSize, buff);

}

Environmental_Update(PressToSend,PressToSend2, HumToSend, TempToSend,TempToSend2);

谢谢你。

4

1 回答 1

0

您无法将 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, 0, 0, 209, 133, 1, 0, 5, 10, 237, 0, 0, 0];
    var temp = fromBytesToInt16(received[8], received[9]) / 100;
    print('temperature: $temp');
}

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

于 2021-04-23T10:50:39.610 回答