主题
TCP 客户端例程 3:串口 ↔ TCP 透传(把现场串口设备搬到远端)
这一页只讲这一个例程。同组其余例程、以及这个库的函数说明都在 05-03-tcp-client。
适用:同例程 1(需带 RS485/232 串口的机型)| 依赖模块:tcp_client com | 难度:★★☆
场景:现场的仪表只出 RS485,远端软件想直接跟它说话。做法是让设备的串口和一条 TCP 连接互相转发 —— 这也是 DTU 的标准形态。两侧都要设置:TCP 侧告诉固件"这条连接拿来透传",串口侧把自己设为透传口、并自动起轮询线程(不用再手工 com.start)。
完整代码(可直接下载运行):
lua
-- 串口 ↔ TCP 全双工透传;两边的 set_transparent 都要调
local com1 = com.setup(1, 9600, com.NONE, 8, 1) -- RS485 参数按现场仪表改
if not com1 then
print("串口打开失败,检查串口号与波特率档位")
return
end
tcpc = tcp_client.creat("192.168.1.100", 9000) -- 远端透传服务端
tcpc:reg(tcp_client.CONNECTED, function()
print("透传通道已建立")
end)
tcpc:start()
tcpc:set_transparent() -- ① TCP 侧:这条连接用于透传
com1:set_transparent() -- ② 串口侧:设为透传口并自动启动轮询要点:
- 两个
set_transparent()缺一不可:① 标记 TCP 通道;② 把串口登记成透传口。顺序无所谓,但两边都要有。 - 设成透传口不需要再调
com.start()(内部会自动起轮询线程),也不需要注册RECVDATA—— 数据由固件直接转发。 - 一旦开始透传,同一串口上就不要再自己
send/recv,会抢数据、打乱时序。 - 波特率必须是允许档位之一(见 com.setup),填错不报错、只返回
nil,所以上面对com1做了判空。 - 免脚本、直接用上位机点配置的完整做法见 远程串口透传。
验证方法:
- PC 上起一个监听 9000 端口的 TCP 服务端(或让上位机的透传服务端等着)。
- 串口上挂一块 Modbus 仪表,通电能出数。
- 服务端把 Modbus 查询帧发出去,应在串口侧送出去;仪表的应答也应原样回到服务端。
- 断开重连:TCP 重新建链后透传自动恢复,不用重下载脚本。
- 用串口调试助手在 PC 侧直接收发原始字节,确认固件没有额外插入任何字节 —— 它只做搬运,不做转换。
注意事项:
- 只用了一侧
set_transparent,表现是「一边通、一边没反应」。 - 透传期间脚本里再对同一串口
send,数据链路会乱,应当完全交给固件。 - 波特率不在允许列表时
com.setup返回nil,与「串口不存在」无法区分;先把参数核对一遍。