跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

多路双向串口转网口上位机 C++ 源码及 Socket 通信实现

基于 Qt 框架的多路双向串口转网口上位机,支持 UDP 和 TCP 协议通信。具备自动连接、配置保存、十六进制收发显示等功能。采用面向对象设计实现网络协议多态,包含指数退避重连机制及动态状态指示灯。适用于工业设备快速连接场景,编译需注意路径纯英文设置。

灭霸发布于 2026/3/15更新于 2026/6/125 浏览
多路双向串口转网口上位机 C++ 源码及 Socket 通信实现

多路双向串口转网口上位机 C++ 源码及 Socket 通信实现

功能概述

完成了多路网口和串口数据转换的功能。可实现串口接收到的数据通过网口发送出去;网口接收到的数据通过串口发送出去。

  • 带有附加的发送窗口,可填写指定的 16 进制数据并完成发送。
  • 带有接收窗口,可以 16 进制的方式显示数据。
  • 具备自动连接功能,可实现主动连接服务器的功能。
  • 可保存配置文件,和自动加载上次的配置。
  • 可选择 UDP 和 TCP 两种连接方式。
  • 通过网口的继承和派生,实现多态功能。

开发环境

  • 开发环境:Qt5.10.1
  • 依赖库:Qt 自带的 QSerialPort
  • 编译要求:请将源码放到纯英文路径下再编译。
  • 说明:源代码中包含注释,设计说明文档等。

核心设计

数据转发逻辑

TranWidget 类作为数据转发枢纽,负责串口与网口的交互:

class TranWidget : public QWidget {
    Q_OBJECT
public:
    explicit TranWidget(QWidget *parent = nullptr);
    void forwardData(const QByteArray &data); // 数据转发枢纽
private slots:
    void onSerialReadyRead();
    void onSocketReadyRead();
private:
    QSerialPort *serial;
    AbstractNetClient *netClient; // 多态关键点
    HexDisplayWidget *display;
};

重点在于 AbstractNetClient 抽象类,TCP 和 UDP 客户端都从这里派生。当用户切换协议时:

void switchProtocol(ProtocolType type) {
    delete netClient; // 销毁旧连接
    netClient = (type == TCP) ? new TcpClient() : new UdpClient();
    connect(netClient, &AbstractNetClient::dataReceived, this, &TranWidget::handleNetData);
}

十六进制处理

十六进制处理是容易踩坑的地方,显式类型转换确保了 0-255 的正确表示:

QString hexConvert(const QByteArray &data) {
    QString output;
    for (char ch : data) {
        output += QString("%1 ").arg(static_cast<quint8>(ch), 2, 16, QLatin1Char('0'));
    }
    return output.toUpper().trimmed();
}

子功能模块

  • 独立的串口网口 Tran 转换控件
  • 继承实现的网口类型选择
  • 接收发送都是十六进制显示
  • 带有配置自动保存功能
  • 具备自动连接功能,无需人工干预
  • 带有动态的状态指示灯 LED 闪烁

文章配图

高级特性

自动重连机制

自动重连机制采用了指数退避策略,重试间隔从 1 秒开始,最多累积到 30 秒:

void AutoConnector::startReconnect() {
    if (retryCount < 5) {
        retryInterval = qMin(retryInterval * 2, 30);
        QTimer::singleShot(retryInterval * 1000, this, &AutoConnector::attemptConnect);
    } else {
        emit connectionFailed(tr("Maximum retries reached"));
    }
}

状态指示灯

状态指示灯模拟真实 LED 的渐变效果:

void StatusLED::paintEvent(QPaintEvent*) {
    QPainter painter(this);
    QRadialGradient grad(rect().center(), width()/2);
    grad.setColorAt(0, currentColor.lighter(150));
    grad.setColorAt(1, currentColor.darker(200));
    painter.setBrush(grad);
    painter.drawEllipse(rect());
}

配置文件处理

配置文件处理使用了 INI 格式,并实现了序列化重载:

void saveWindowState() {
    QSettings cfg("config.ini", QIniFormat);
    cfg.setValue("MainWindow/geometry", saveGeometry());
    cfg.setValue("Connections", activeConnections); // 存储对象
}

文章配图 文章配图 文章配图 文章配图 文章配图

应用场景

遇到过一个实际案例:某工业设备每次上电后需要在 5 秒内建立连接。通过配置自动连接参数,设置重试间隔为 500 毫秒,完美解决了手动操作来不及的问题。这种灵活的重试策略在关键场景特别实用。

编译注意事项

最后提醒编译注意事项:千万别用中文路径!Qt 的元对象编译器(moc)处理宽字符路径时偶尔会异常,见过有人折腾两天才发现是路径里有中文括号,这坑实在不值得踩。

目录

  1. 多路双向串口转网口上位机 C++ 源码及 Socket 通信实现
  2. 功能概述
  3. 开发环境
  4. 核心设计
  5. 数据转发逻辑
  6. 十六进制处理
  7. 子功能模块
  8. 高级特性
  9. 自动重连机制
  10. 状态指示灯
  11. 配置文件处理
  12. 应用场景
  13. 编译注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互
  • 5 款值得关注的国产 AI 大模型功能评测
  • 大模型分布式训练与高效调参技术实战
  • Docker核心概念与架构
  • Spring AI Alibaba 深度解析:Java 构建企业级 AI 应用框架指南
  • OpenClaw Memory 本地模式配置:Ubuntu+CUDA+cuDNN+llama.cpp
  • 基于 Q-learning 的无人机三维路径规划原理及 MATLAB 实现
  • Spring ShedLock 指南
  • Java 网络编程:TCP 流套接字编程
  • Whisper-large-v3 语音识别模型部署与会议转录实测
  • AIGC 视频生成成本优化实战:文字 + 图片输入下 20 秒与 30 秒模型选型与价格对比
  • 鸿蒙金融理财全栈项目:架构设计、数据安全与体验优化
  • Python 中的 with 语句与 try 语句:资源管理对比
  • OpenClaw 中文发行版部署指南:npm/Docker 多模式安装与配置
  • whisper-large-v3-turbo 模型一键部署指南
  • 修复 Anaconda 开始菜单快捷方式丢失及 mkmenus 报错
  • Z 字形变换与外观数列算法实战解析
  • VSCode Copilot 配置文件提示未知工具警告解析
  • 2026 年 2 月 AIGC 行业模型发布及前沿资讯
  • Claude Code 本地环境配置与 API 接入指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online