Skip to content

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 做了判空。
  • 免脚本、直接用上位机点配置的完整做法见 远程串口透传。

验证方法:

  1. PC 上起一个监听 9000 端口的 TCP 服务端(或让上位机的透传服务端等着)。
  2. 串口上挂一块 Modbus 仪表,通电能出数。
  3. 服务端把 Modbus 查询帧发出去,应在串口侧送出去;仪表的应答也应原样回到服务端。
  4. 断开重连:TCP 重新建链后透传自动恢复,不用重下载脚本。
  5. 用串口调试助手在 PC 侧直接收发原始字节,确认固件没有额外插入任何字节 —— 它只做搬运,不做转换。

注意事项:

  • 只用了一侧 set_transparent,表现是「一边通、一边没反应」。
  • 透传期间脚本里再对同一串口 send,数据链路会乱,应当完全交给固件。
  • 波特率不在允许列表时 com.setup 返回 nil,与「串口不存在」无法区分;先把参数核对一遍。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研