Flutter Blue Plus 返回不同的值

问题描述 投票:0回答:2

我正在使用 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

制造商是中国人,我们在这里遇到了很大的语言障碍;我一直在使用谷歌翻译来翻译他的电子邮件,但其中大部分对我来说毫无意义。你知道他在说什么吗?

谢谢! 丹

flutter bluetooth
2个回答
1
投票

我不明白让你困惑的部分。您正在尝试从 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 中执行此操作。


0
投票

这对某些人可能有帮助,因为我花了几个小时才找到解决方案。 我的温度设备和其他一些医疗设备也遇到了类似的问题。 当谈到临时设备时 以前,flutter blue 用于返回自动解析的温度值 但当我升级到 flutter blue plus 时,它返回一个 int 列表,它是一个携带 ASCII 编码数据的字节数组。

为了解码它,请使用

String decoded = String.fromCharCodes(data);

解码后,我能够获得与之前使用 flutter blue 获得的类似输出

© www.soinside.com 2019 - 2024. All rights reserved.