最近搞了个串口转以太网的小工具,支持双向数据转发还带图形界面,顺手把源码整理出来了。这玩意儿最实用的地方在于能让老设备通过网口联网,咱们直接上干货聊聊实现细节

张开发
2026/4/10 14:45:42 15 分钟阅读

分享文章

最近搞了个串口转以太网的小工具,支持双向数据转发还带图形界面,顺手把源码整理出来了。这玩意儿最实用的地方在于能让老设备通过网口联网,咱们直接上干货聊聊实现细节
串口转以太网通信源代码C语言C编写支持多路转换双向通信支持UDP和TCP客户端 提供带注释带设计文档 使用说明介绍 1.功能介绍 完成了多路网口和串口数据转换的功能。 可实现串口接收到的数据通过网口发送出去而网口接收到的数据通过串口发送出去。 带有附加的发送窗口可填写指定的16进制数据并完成发送。 带有接收窗口可以16进制的方式显示数据。 具备自动连接功能可实现主动连接服务器的功能。 可保存配置文件和自动加载上次的配置。 可选择UDP和TCP两种连接方式。 通过网口的继承和派生实现多态功能。 2.环境说明 开发环境是Qt5.10.1使用Qt自带的QSerialPort。 源代码中包含注释设计说明文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 4.子功能模块介绍 独立的串口网口Tran转换控件 继承实现的网口类型选择 接收发送都是十六进制显示 带有配置自动保存功能 具备自动连接功能无需人工干预 带有动态的状态指示灯LED闪烁先看核心数据转发逻辑。代码里搞了个TranWorker线程类负责在两个数据通道之间当搬运工。核心就这几句while (m_running) { // 从串口搬到网络 if (m_serial-bytesAvailable()) { QByteArray data m_serial-readAll(); emit serialData(data); // 界面显示 m_network-write(data); // 转发到网络 } // 从网络搬到串口 if (m_network-bytesAvailable()) { QByteArray data m_network-readAll(); emit networkData(data); m_serial-write(data); } QThread::msleep(10); }这里用了个简单粗暴的轮询方式实际项目里可以用信号槽替代。不过考虑到跨线程通信轮询反而更稳定——毕竟有些老串口驱动不太靠谱。网络层设计比较有意思用继承玩了个多态。BaseSocket抽象类定义接口派生出的TcpSocket和UdpSocket实现不同协议。配置切换时直接new对应的子类就行void NetworkWrapper::reconnect() { delete m_socket; // 干掉旧连接 if (isTcp) { m_socket new TcpSocket(this); } else { m_socket new UdpSocket(this); } connect(m_socket, BaseSocket::connected, this, NetworkWrapper::onConnected); m_socket-connectTo(ip, port); }TCP和UDP的不同处理被封装在子类里上层调用完全无感知。比如UDP需要处理目标地址在发送时多带个参数void UdpSocket::write(const QByteArray data) { if(m_target.isNull()) return; m_udp-writeDatagram(data, m_target, m_port); // UDP特殊处理 }界面部分有几个实用设计值得一说。状态指示灯不是简单的贴图切换而是用了个QTimer做呼吸灯效果void StatusLED::blink() { m_opacity 1.0; m_timer.start(50); // 50ms刷新一次 } void StatusLED::paintEvent(QPaintEvent*) { QPainter p(this); QColor color m_connected ? Qt::green : Qt::red; color.setAlphaF(m_opacity); // 透明度渐变 p.setBrush(color); p.drawEllipse(rect()); } // 定时器触发渐变 void StatusLED::onTimeout() { m_opacity - 0.1; if(m_opacity 0) m_opacity 0; update(); }配置保存用了QSettings直接存注册表Windows或.plist文件Mac自动记住上次参数void saveSettings() { QSettings settings; settings.setValue(PortName, ui-comboPort-currentText()); settings.setValue(BaudRate, ui-comboBaud-currentIndex()); // ...其他参数 }实际用起来注意几个坑串口读取建议设置足够大的缓冲区有些设备会突发大量数据网络超时最好做个重连计数避免界面卡死十六进制显示处理别直接用QString::toUtf8()碰到非打印字符会丢数据。串口转以太网通信源代码C语言C编写支持多路转换双向通信支持UDP和TCP客户端 提供带注释带设计文档 使用说明介绍 1.功能介绍 完成了多路网口和串口数据转换的功能。 可实现串口接收到的数据通过网口发送出去而网口接收到的数据通过串口发送出去。 带有附加的发送窗口可填写指定的16进制数据并完成发送。 带有接收窗口可以16进制的方式显示数据。 具备自动连接功能可实现主动连接服务器的功能。 可保存配置文件和自动加载上次的配置。 可选择UDP和TCP两种连接方式。 通过网口的继承和派生实现多态功能。 2.环境说明 开发环境是Qt5.10.1使用Qt自带的QSerialPort。 源代码中包含注释设计说明文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 4.子功能模块介绍 独立的串口网口Tran转换控件 继承实现的网口类型选择 接收发送都是十六进制显示 带有配置自动保存功能 具备自动连接功能无需人工干预 带有动态的状态指示灯LED闪烁源码里还藏了些彩蛋比如支持AT指令过滤、数据镜像到文件等功能。整个项目编译记得装Qt5的SerialPort模块建议用2019后的MSVC编译器MinGW偶尔会抽风。最后说下适用场景工业网关转换、物联网设备调试、或者单纯想用电脑当串口服务器。代码扩展性不错想加协议解析可以直接继承TranWorker重写处理逻辑。

更多文章