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

COMARK BT42温度读取异常:ArrayBuffer转Float32结果与实际值不符

解决COMARK BT42温度数据读取异常问题

问题描述

在Ionic Angular应用中读取COMARK BT42设备的温度数据(运行于Android设备Datalogic Memor 10),获取到的ArrayBuffer转换为浮点数后结果异常:代码输出-147578438597117740000,但设备实际显示温度为22.5°C。

现有代码:

pullTemp(id, service, characteristic){
    this.ble.startNotification(id, service, characteristic).subscribe(data => {
      var myArray = new Uint8Array(data[0]);
    var temperatureData = myArray.slice(1,5); // getting bytes 2-5
    var temperature = new Float32Array(new Uint8Array(temperatureData.buffer).reverse().buffer)[0]; // reversing the bytes so as to convert it to little-endian
    console.log(temperature);
      this.readout = temperature + "°C";
  });
  }

问题根源

根据BT42蓝牙API文档,温度数据并非32位浮点数,而是以16位有符号小端整数存储,单位为0.1°C。原代码错误地将4个字节按32位浮点数解析,导致结果完全偏离。

修正代码

pullTemp(id, service, characteristic){
    this.ble.startNotification(id, service, characteristic).subscribe(data => {
      // 将ArrayBuffer转为Uint8Array
      const myArray = new Uint8Array(data[0]);
      // 提取温度数据:第2、3字节(索引1和2)
      const tempBytes = myArray.slice(1, 3);
      // 用DataView读取小端序的16位有符号整数
      const dataView = new DataView(tempBytes.buffer);
      const rawTemp = dataView.getInt16(0, true); // true表示小端字节序
      // 转换为实际温度(单位:°C)
      const temperature = rawTemp * 0.1;
      console.log(temperature);
      // 格式化显示,保留1位小数
      this.readout = temperature.toFixed(1) + "°C";
  });
}

关键说明

  • 温度数据仅占用2个字节,而非原代码中的4个字节
  • 使用DataView.getInt16直接处理小端序数据,无需手动反转字节
  • 原始整数乘以0.1即可得到实际摄氏度值,toFixed(1)保证显示精度与设备一致

内容的提问来源于stack exchange,提问作者robertryanmoore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:45:31