文档中心 › 串口采集
RS-485/串口仪表数据采集到 Web 与 MQTT
很多电表、称重仪表、流量计没有以太网口,只有 RS-232/RS-485 串口。把它们的数据采集到上位机 Web 或 MQTT 平台,通常需要三步:接线对上、协议说清、软件轮询。本文以 nscada 为例说明落地方法。
一、接线与端口参数
- 一台设备单点对连用 RS-232;多台同总线建议 RS-485(A/B 双绞线,两端加 120Ω 终端电阻);
- 先确认设备说明书里的波特率、数据位、停止位、校验位,例如 9600-8-N-1;
- Windows 看设备管理器里的 COM 号;Linux 通常是 /dev/ttyUSB0 或 /dev/ttyS0,注意把运行用户加入 dialout 组。
二、把“协议”变成点表
仪表协议一般就是:发送一帧请求(HEX),设备回一帧数据。nscada 的做法是把“读指令”配在设备上:
读指令:txHex = "01 03 00 00 00 02",CRC = crc16-modbus
点表: 地址 = 指令代号:响应字节偏移(如 R1:4 → float32)
点表地址格式:<指令代号>:<响应内偏移>,如 R1:0、DATA:4;类型支持 bool/int16/uint16/int32/uint32/float32/float64,字节序 big/little 可配。
三、串口上的常见坑
- 串口占用冲突:一个串口只能被一个进程打开;多个采集任务共口必须串行——采集引擎对同串口做了事务互斥;
- 一帧读不全/粘帧:按“静默窗口”切帧(无新字节超过设定毫秒即认为一帧结束),响应边界可调;
- CRC 不匹配:核对是 CRC16-Modbus 还是和校验,nscada 支持发送前自动追加 none/crc16-modbus/sum8;
- 电平/驱动:RS-485 要 A/B 别接反,USB 转 485 线驱动装好。
四、从串口到 MQTT/HTTP
采集到数据后与网络设备并无差别:数据写本地 SQLite 的同时进入 Outbox 队列,由转发器发布到 MQTT 主题(如 cx/{deviceId}/data,支持 QoS)或 HTTP 批量上送。这样即使总线上某台仪表临时离线,其它设备照常采集,历史数据也不丢。
