串口服务器测试实战:用 C 语言通过 TCP 方式操作 Moxa NPort

串口服务器测试实战:用 C 语言通过 TCP 方式操作 Moxa NPort 串口服务器测试实战用 C 语言通过 TCP 方式操作 Moxa NPort在工业现场大量设备仍然使用 RS-232/485/422 串口通信。但随着网络的普及工程师们更希望用以太网来远程管理这些串口设备——串口服务器正是为此而生。它将串口数据透明地映射到 TCP/IP 网络上让远程主机像操作网络端口一样操作串口。本文以 Moxa NPort 串口服务器为例介绍其在TCP Server 模式下的工作原理并提供一套完整的 C 语言测试工具帮助在项目开发阶段快速验证串口服务器的连通性和数据收发是否正常。一、串口服务器的三种网络模式Moxa NPort 串口服务器通常支持三种网络通信模式模式连接方向特点TCP Server设备被动监听等待客户端连接适合集中采集远程主机主动连入TCP Client设备主动连接远端服务器适合现场设备向上推送数据UDP无连接单向数据报低延迟广播场景允许少量丢包三者的核心区别在于谁发起连接。选择哪种模式取决于网络架构——如果远程主机是控制中心串口服务器放在现场那么 TCP Server 模式是最自然的选择主机按需连接随时收发。二、TCP Server 模式的工作流程TCP Server 模式的通信流程非常清晰TCP 三次握手 远程主机客户端 ──────────────► NPort监听端口 ◄────────────── 建立连接 发送数据客户端 ──TCP──► NPort ──串口──► 串口设备 接收数据串口设备 ──串口──► NPort ──TCP──► 客户端NPort 在指定端口默认 4001监听等待 TCP 连接远程主机作为 TCP Client 主动发起连接连接建立后双向数据透明传输TCP 数据 → 串口输出串口输入 → TCP 回传一个连接建立后串口数据仅发送给该客户端简单说连上 TCP 端口就等于连上了物理串口。三、测试工具设计与实现为了验证串口服务器工作是否正常我们用 C 语言编写一个测试客户端提供三种工作模式交互模式手动输入数据观察回显单次发送模式发送一条消息后退出自动测试模式循环发送多组测试数据自动校验收发结果3.1 项目结构moxa-c-code/ ├── config.h # 连接配置默认IP、端口、缓冲区大小 ├── moxa_client.c # 主程序 ├── Makefile # 构建脚本3.2 连接配置config.h中定义了默认连接参数和缓冲区大小#defineDEFAULT_IP192.168.12.25#defineDEFAULT_PORT4001#defineRECV_BUF_SIZE1024#defineSEND_BUF_SIZE1024IP 和端口同时支持命令行参数覆盖无需修改代码即可适配不同环境。3.3 核心TCP 连接与收发连接函数是整个程序的基础。创建 TCP 套接字后通过inet_pton将 IP 地址转换为网络格式再调用connect完成三次握手staticintconnect_to_moxa(constchar*ip,intport){intsockfdsocket(AF_INET,SOCK_STREAM,0);// ... 省略错误处理 ...structsockaddr_inaddr;memset(addr,0,sizeof(addr));addr.sin_familyAF_INET;addr.sin_porthtons(port);inet_pton(AF_INET,ip,addr.sin_addr);connect(sockfd,(structsockaddr*)addr,sizeof(addr));returnsockfd;}3.4 交互模式select 实现双工收发交互模式下程序需要同时监听键盘输入和网络数据。使用select实现 I/O 多路复用FD_SET(STDIN_FILENO,readfds);// 监听键盘输入FD_SET(sockfd,readfds);// 监听网络数据select(maxfd1,readfds,NULL,NULL,tv);键盘输入的换行符\n自动转为\r\n符合串口通信惯例。3.5 自动测试模式这是验证串口服务器数据通道的关键功能。程序循环发送多组测试数据等待回显对比收发内容constchar*test_msgs[]{Hello Moxa,ABCABCABC,0123456789,};for(inti0;icount;i){send(sockfd,msg,len,0);// 发送intnrecv_buf(sockfd,buf,...,2000);// 等待回显2秒超时memcmp(msg,buf,len)0?PASS:INFO;// 对比结果}测试完成后输出汇总报告 Test Result Total: 10 Passed: 10 Failed: 0 Timeout: 0关于回显如果串口设备的 TX 和 RX 短接环回数据会原样返回测试结果为echo matched。如果连接了实际设备返回数据可能不同此时只要有数据返回即判定为通过。四、使用方法编译make交互模式./moxa_client-i192.168.12.25-p4001连接后直接输入文字按回车发送串口返回的数据会实时显示。按CtrlC退出。单次发送./moxa_client-i192.168.12.25-p4001-mhello发送一条消息后自动退出适合脚本调用。自动测试# 默认3轮测试./moxa_client-i192.168.12.25-p4001-t# 10轮压力测试./moxa_client-i192.168.12.25-p4001-t-n10五、实测效果连接串口服务器后的交互模式运行效果$ ./moxa_client -i 192.168.12.25 -p 4001 Connecting to 192.168.12.25:4001 ... Connected. Interactive mode. Type message and press Enter to send. CtrlC to quit. hello Sent 7 bytes: hello Recv 7 bytes: hello自动测试模式运行效果$ ./moxa_client -i 192.168.12.25 -p 4001 -t -n 3 Data Send/Recv Test (count3) [Test 1/3] Sending: Hello Moxa Sent 10 bytes Recv 10 bytes: Hello Moxa PASS (echo matched) [Test 2/3] Sending: ABCABCABC Sent 9 bytes Recv 9 bytes: ABCABCABC PASS (echo matched) [Test 3/3] Sending: 0123456789 Sent 10 bytes Recv 10 bytes: 0123456789 PASS (echo matched) Test Result Total: 3 Passed: 3 Failed: 0 Timeout: 0六、注意事项网络连通性测试前确保主机与串口服务器在同一网段或路由可达。可通过ping 192.168.12.25先行验证。端口配置NPort 默认监听 4001 端口管理端口为 966。确保在 NPort 管理界面中将串口模式配置为 TCP Server。串口参数匹配NPort 的串口波特率、数据位、校验位需与对端串口设备一致否则数据会乱码。连接数限制TCP Server 模式默认只允许一个客户端连接。如果已有连接占用新的连接会被拒绝。超时断开NPort 支持配置空闲超时时间长时间无数据传输可能自动断开。七、总结串口服务器的 TCP Server 模式本质上就是一个串口到 TCP 的透明桥——连接 TCP 端口等于连接物理串口。理解了这个本质测试就很简单了连上去发数据看回显。本文提供的 C 语言测试工具涵盖了交互调试和自动化测试两种场景可以在项目初期快速验证硬件连通性也可以集成到自动化测试流程中做长期可靠性验证。参考链接TCP Server Mode for NPort - Moxa 官方技术文档NPort 5100 系列产品页 - Moxa