我正在使用 flutter_blue_plus 中的示例代码。我可以连接到设备并将数据流作为数组读取:
[90, 0, 0, 6, 13, 0, 0, 0, 0, 0, 0, 0, 37, 5, 0, 0, 0, 0, 0, 0, 0, 0, 45, 5, 49, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 91, 118, 90]
void onNewReceivedData(List<int> data) {
_numberOfMessagesReceived += 1;
_receivedData.add( "$_numberOfMessagesReceived: $data" as int);
if (_receivedData.length > 5) {
_receivedData.removeAt(0);
}
print(_receivedData.join("\n"));
refreshScreen();
}
但它们不是正确的数字。我已经联系了我尝试使用的蓝牙模块的制造商,他告诉我这是正确的并向我发送了以下内容:
低字节45 = 0x2D
高字节05 = 0x05
0x052D=1325=13.2V
制造商是中国人,我们在这里遇到了很大的语言障碍;我一直在使用谷歌翻译来翻译他的电子邮件,但其中大部分对我来说毫无意义。你知道他在说什么吗?
谢谢! 丹
我不明白让你困惑的部分。您正在尝试从 16 位小端值构建一个值。我猜结果的单位是厘伏(1/100 伏)。 (如果您能包括所使用的服务,那么回答会容易得多。)
如果您已经提取了值 45 和 5,那么您可以通过以下方式将其转换为完整值:
const low = 45;
const high = 5;
const volts = ((high << 8) + low) / 100; // 13.25
这会将
high
左移 8 位(使其成为最高有效字节),添加 low
(作为最低有效字节),并将整个值除以 100 以获得伏特。
这些值是用十六进制还是十进制表示并不重要。这些只是写数字的不同方式。它对实际数字没有影响。
另请参阅 Dart 将两个小端的 Uint8 转换为 Uint16 了解如何直接从 Uint8List 中执行此操作。
这对某些人可能有帮助,因为我花了几个小时才找到解决方案。 我的温度设备和其他一些医疗设备也遇到了类似的问题。 当谈到临时设备时 以前,flutter blue 用于返回自动解析的温度值 但当我升级到 flutter blue plus 时,它返回一个 int 列表,它是一个携带 ASCII 编码数据的字节数组。
为了解码它,请使用
String decoded = String.fromCharCodes(data);
解码后,我能够获得与之前使用 flutter blue 获得的类似输出