Flutter Blue Plus返回数据异常,求解析蓝牙模块数据格式
问题解析与修正方案
厂商说明的含义
厂商说的是蓝牙模块用**小端序(Little Endian)**传输多字节数值,直白点讲:
- 一个完整的数值会拆成多个字节发送,低位字节先传,高位字节后传
- 拿你收到的数组里的
45, 5举例:- 十进制45转十六进制是
0x2D,这是数值的低字节 - 十进制5转十六进制是
0x05,这是数值的高字节 - 把高字节放前面、低字节放后面,拼成十六进制数
0x052D,转成十进制就是1325 - 最后除以100(模块输出的是毫伏级数值),得到实际电压值13.25V,厂商写13.2V是近似处理
- 十进制45转十六进制是
你的代码问题
现在的代码完全没做有效数据解析,还犯了两个低级错误:
- 把字符串
"$_numberOfMessagesReceived: $data"强行转成int,这要么报错要么得到完全错误的数值 - 只是把原始数组转成字符串存起来,根本没提取和计算模块传输的物理量
修正后的代码示例
假设你要提取数组里的电压值(对应数组索引22和23的45,5),可以这么改:
void onNewReceivedData(List<int> data) { _numberOfMessagesReceived += 1; // 按小端序解析电压值:低字节在索引22,高字节在索引23 int lowByte = data[22]; int highByte = data[23]; // 拼接成完整数值:高字节左移8位 + 低字节 int rawValue = (highByte << 8) | lowByte; // 转成实际电压(除以100,因为1325代表13.25V) double voltage = rawValue / 100; // 存储解析后的结果 _receivedData.add("$_numberOfMessagesReceived: 电压=${voltage.toStringAsFixed(2)}V"); if (_receivedData.length > 5) { _receivedData.removeAt(0); } print(_receivedData.join("\n")); refreshScreen(); }
补充提醒
- 你需要先确认蓝牙模块的协议文档,搞清楚数组里哪些索引对应哪些物理量(比如电压、电流、温度等)
- 所有多字节数值都要按小端序解析:先取低字节,再取高字节,用
(高字节 << 8) | 低字节拼接成十进制数,最后根据厂商给定的倍率(比如除以10、100、1000)转成实际物理量
内容的提问来源于stack exchange,提问作者dan k
相关产品推荐
相关产品推荐

