概述
【T3000】边缘一体机自带两路RS485接口和一路RS232接口,在此统称为串口,对应Node-red中的【串口】节点。串口是双向通信,因此有一个输入口和一个输出口,节点的输入内容一般为Modbus-RTU问询帧,输出为Modbus-RTU应答帧。
PS-1:一路RS485接口/RS232接口最多可接入32个设备,32个设备之间应该使用各不相同的地址码以作区别。
PS-2:本示例仅简单介绍串口节点的功能作用,若要使用本节点,建议搭配Modbus-请求/Modbus-解析节点,详情请参考:
此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/aiotedge-v1xdocs/frdwwgyi90min1kg
输入
#Modbus-RTU问询帧(buffer)
msg.payload
输出
#Modbus-RTU应答帧(buffer)
msg.payload
串口功能配置项
串口配置说明:
串口:RS485-1/RS485-2/RS232
波特率:115200/57600/38400/19200/9600/4800/2400 (常用 9600)
数据位:8/7(常用 8)
停止位:1/2(常用 1)
校验位:none(无校验)/odd(偶校验)/even(奇校验)(常用 none)
请求超时:单位ms,超过时间无响应则报错
分帧间隔:单位ms,当超过多长时间没收到数据认为一帧数据结束
示例
接入一个RS485传感器设备和一个RS232传感器设备并使用【串口】节点采集数据
以厂家提供的RS485传感器说明为例:
RS485温湿度采集命令为:[1 ,3 ,0 ,0 ,0 ,2 ,196,11]
同理可得:
RS232温湿度、气压采集命令为:[1,3,0,0,0,3,5,203]
节点接线图:
PS:两个function节点的解析代码
演示视频
此处为语雀视频卡片,点击链接查看:2025-06-26 10-59-34.mp4
node-red完整流程代码
[{"id":"36f881c708c64b55","type":"serial port","z":"bfc81969979a1c7d","name":"","serial":"bfd091bd1d2c66fc","x":510,"y":200,"wires":[["44fa7e0d474ab8d0","7c0c1bbb324b9478"]]},{"id":"dec4f001fcbe05ca","type":"serial port","z":"bfc81969979a1c7d","name":"","serial":"2fead045a0e33697","x":500,"y":320,"wires":[["3a3baab6fceb38b2","31ceeef52e1185b3"]]},{"id":"0d23d2a9d966c60e","type":"inject","z":"bfc81969979a1c7d","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[1 ,3 ,0 ,0 ,0 ,2 ,196,11]","payloadType":"bin","x":240,"y":200,"wires":[["36f881c708c64b55","fa411c6d5632c37f"]]},{"id":"fe8a326ff1d1f6aa","type":"inject","z":"bfc81969979a1c7d","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[1,3,0,0,0,3,5,203]","payloadType":"bin","x":240,"y":320,"wires":[["dec4f001fcbe05ca","74b93a7dd22a1a87"]]},{"id":"fa411c6d5632c37f","type":"debug","z":"bfc81969979a1c7d","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":390,"y":140,"wires":[]},{"id":"74b93a7dd22a1a87","type":"debug","z":"bfc81969979a1c7d","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":260,"wires":[]},{"id":"44fa7e0d474ab8d0","type":"function","z":"bfc81969979a1c7d","name":"function 1","func":"nvar buffer = msg.payload;nconst addressCode = buffer[0];n// const functionCode = buffer[1];n// const byteCount = buffer[2];nconst humidityBytes = [buffer[3], buffer[4]];nconst temperatureBytes = [buffer[5], buffer[6]];nn// 计算湿度值nconst humidity = parseInt(humidityBytes.map(byte => byte.toString(16).padStart(2, '0')).join(''), 16);nn// 计算温度值nconst temperature = parseInt(temperatureBytes.map(byte => byte.toString(16).padStart(2, '0')).join(''), 16);nnvar jsonData = {n "wendu": temperature / 10,n "shidu": humidity / 10n}nmsg.payload = jsonData;nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":200,"wires":[["c6a8e236aa4a8370"]]},{"id":"3a3baab6fceb38b2","type":"function","z":"bfc81969979a1c7d","name":"function 2","func":"var buffer = msg.payload;nconst addressCode = buffer[0];n// const functionCode = buffer[1];n// const byteCount = buffer[2];nnconst temperatureBytes = [buffer[3],buffer[4]];nconst humidityBytes = [buffer[5],buffer[6]];nconst airPressureBytes = [buffer[7], buffer[8]];nn// 计算温度值nconst temperature = parseInt(temperatureBytes.map(byte => byte.toString(16).padStart(2, '0')).join(''), 16);n// 计算湿度值nconst humidity = parseInt(humidityBytes.map(byte => byte.toString(16).padStart(2,'0')).join(''),16);n// 计算气压值nconst airPressure = parseInt(airPressureBytes.map(byte => byte.toString(16).padStart(2, '0')).join(''), 16);nnvar jsonData = {n "wendu":(temperature/100-40).toFixed(2),n "shidu": humidity / 100,n "qiya": airPressure / 10n}nmsg.payload = jsonData;nreturn msg;nn","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":320,"wires":[["518bbcc53e188e9a"]]},{"id":"c6a8e236aa4a8370","type":"debug","z":"bfc81969979a1c7d","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":200,"wires":[]},{"id":"518bbcc53e188e9a","type":"debug","z":"bfc81969979a1c7d","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":320,"wires":[]},{"id":"7c0c1bbb324b9478","type":"debug","z":"bfc81969979a1c7d","name":"debug 5","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":700,"y":160,"wires":[]},{"id":"31ceeef52e1185b3","type":"debug","z":"bfc81969979a1c7d","name":"debug 6","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":700,"y":260,"wires":[]},{"id":"bfd091bd1d2c66fc","type":"serial config","name":"","serialport":"/dev/ttyS8","baudrate":"9600","databits":"8","stopbits":"1","parity":"none","timeout":"50","reqtimeout":"1000"},{"id":"2fead045a0e33697","type":"serial config","name":"","serialport":"/dev/ttyS6","baudrate":"9600","databits":"8","stopbits":"1","parity":"none","timeout":"50","reqtimeout":"1000"}]