You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Blue Plus返回数据异常,求解析蓝牙模块数据格式

问题解析与修正方案

厂商说明的含义

厂商说的是蓝牙模块用**小端序(Little Endian)**传输多字节数值,直白点讲:

  • 一个完整的数值会拆成多个字节发送,低位字节先传,高位字节后传
  • 拿你收到的数组里的45, 5举例:
    1. 十进制45转十六进制是0x2D,这是数值的低字节
    2. 十进制5转十六进制是0x05,这是数值的高字节
    3. 把高字节放前面、低字节放后面,拼成十六进制数0x052D,转成十进制就是1325
    4. 最后除以100(模块输出的是毫伏级数值),得到实际电压值13.25V,厂商写13.2V是近似处理

你的代码问题

现在的代码完全没做有效数据解析,还犯了两个低级错误:

  1. 把字符串"$_numberOfMessagesReceived: $data"强行转成int,这要么报错要么得到完全错误的数值
  2. 只是把原始数组转成字符串存起来,根本没提取和计算模块传输的物理量

修正后的代码示例

假设你要提取数组里的电压值(对应数组索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:02:42