如何解决解码 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 举报,一经查实,本站将立刻删除。