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
相关产品推荐
相关产品推荐

