关键在于识别设备类型、匹配协议、处理粘包/分包并稳定维持通知通道:ble秤需扫描serviceuuids、启用notify及descriptor写入;串口秤须用rs232-serial原生插件配置正确参数并发送启动命令。

uni-app 控制外接电子秤获取实时重量,关键不在“连上就行”,而在于**识别设备类型、匹配协议、处理粘包/分包、并稳定维持通知通道**。BLE 秤和串口秤走的是完全不同的技术路径,混用会导致白忙活一整天。
先判断电子秤是 BLE 还是串口(ttySx/USB)
这是第一步也是最容易翻车的一步。很多项目卡在“搜不到设备”或“连上了但收不到数据”,根本原因就是没搞清物理接口类型:
- BLE 电子秤:必须支持蓝牙 4.0+,iOS 强制要求,Android 可选;设备名通常带
WS-、BLE-或厂商缩写;扫描时需传serviceUUIDs: ['0x181D']提高命中率 - 串口电子秤(带安卓屏的台式秤居多):不走蓝牙协议,而是通过 USB 或 RS232 直连,端口名一般是
/dev/ttyS1、/dev/ttyUSB0;uni-app 必须用原生插件,如rs232-serial,usb-serial基本无效 - 经典蓝牙(SPP)秤:极少见,iOS 不支持,Android 需用
plus.bluetooth(HTML5+)而非uni.openBluetoothAdapter
错误现象:uni.startBluetoothDevicesDiscovery 搜不到设备,但用手机蓝牙列表能看到——大概率是串口秤,别再折腾 BLE API 了。
BLE 秤连上后收不到 weight 数据?检查 notify 和 descriptor 写入
BLE 秤的数据不是“主动推”,而是靠你手动打开通知开关 + 订阅特征值。漏掉任一环,onBLECharacteristicValueChange 就永远不会触发:
- 必须先调用
uni.getBLEDeviceCharacteristics找到属性notify: true的 characteristic,典型 UUID 是0x2A9D(体重测量) - 拿到 characteristic 后,不能直接读,要先写 descriptor:
uni.writeBLEDescriptorValue,其中descriptorId通常是0x2902,value是new ArrayBuffer(2),dataView.setUint8(0, 1)(开启 notify) - 有些秤(如某坤宏型号)需要额外发送唤醒命令,比如
sendHexCommand('010203'),否则一直静默;该命令必须在 enable notify 之后发 - 务必监听
uni.onBLECharacteristicValueChange,而不是read回调——通知才是实时流的入口
收到的 ArrayBuffer 怎么解析成公斤数?小心粘包和字节序
BLE 通知来的数据不是“一条一帧”,而是可能合并(两帧黏一起)或拆分(一帧分两次来),且不同厂商编码方式天差地别:
- 标准 GATT
0x2A9D特征值返回的是 IEEE-11073 浮点格式,需按位解析:前 1 字节是标志位(含单位、稳定性),后 2~4 字节才是数值,且可能是 little-endian - 私有协议秤(占 70% 以上)返回的是 ASCII 字符串,如
"STX 005.20 kg CR",需找对起始符0x02和结束符0x0d/0x0a,再做TextDecoder解码 - 强烈建议缓存原始
ArrayBuffer,拼接后再切分:维护一个pendingBuffer = new Uint8Array(),每次收到新 buffer 就concat进去,再按协议规则(如找0x02→0x0d)提取完整帧 - 单位转换别硬编码:从标志位或字符串里提取
'kg'/'lb',再乘对应系数,避免把 5.20 lb 当成 5.20 kg
串口秤怎么在 uni-app 里拿到数据?绕不开原生插件
uni-app 的 JS 层无法直接访问 Android 的 /dev/ttyS1,必须依赖原生封装。目前最稳的是 rs232-serial 插件(不是 usb-serial):
- 初始化时指定正确参数:
port: '/dev/ttyS1'、baudRate: 9600、dataBits: 8、stopBits: 1、parity: 'none';错一个就收不到任何数据 - 串口数据是流式到达的,同样存在粘包问题,需自己做帧头帧尾识别(如
0x02开头、0x0d结尾) - 插件回调返回的是
Uint8Array,不是字符串,要用new TextDecoder().decode(buffer)转成可读文本 - vue2 项目不能直接套用 vue3 插件示例代码,
onReceive注册方式不同,容易静默失败
最常被忽略的一点:串口秤往往默认关闭自动上报,必须先发 RN1 或 ST 命令才能让它开始吐数据——这和 BLE 秤的唤醒指令一样关键,但文档里常常藏得极深。











