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

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

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

灭霸发布于 2026/3/15更新于 2026/7/2447 浏览
多路双向串口转网口上位机 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 () :  ();
    (netClient, &AbstractNetClient::dataReceived, , &TranWidget::handleNetData);
}
TcpClient
new
UdpClient
connect
this

十六进制处理

十六进制处理是容易踩坑的地方,显式类型转换确保了 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. 编译注意事项
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于 Llama 3 构建 RAG 语音助手:集成 Qdrant、Whisper 与 LangChain
  • 2026 年 Python+AI 入门指南:从零基础到实操落地,避开新手常见坑
  • Vivado 工程创建与 FPGA 开发流程指南
  • Go 仿真实践:免疫治疗门诊排队、irAE 与床位挤兑建模
  • DeerFlow 2.0 开源介绍:基于 LangGraph 的智能体编排框架
  • AI 编程范式:从 Vibe Coding 到 Spec Coding
  • 基于 Ollama 与 Open WebUI 的本地大模型知识库搭建指南
  • GitHub 双重验证失效或丢失后的账号恢复方法
  • 前端 EME DRM 防录屏原理及实战代码
  • 工业级存储芯片 CSNP32GCR01-AOW 在无人机飞控系统中的应用实践
  • Qwen2.5-7B-Instruct 模型本地部署与 Modelfile 配置实践
  • llama.cpp 新增 Web UI,本地大模型部署新方案实测
  • 基于 AutoGen 框架构建 AI Agent 实现自动化编程任务
  • Java 虚拟机(JVM)基础原理与运行机制
  • 基于 Dify、大模型与智能体构建私有化智能助手指南
  • Stable Diffusion 图像生成与 sd-scripts 工具使用指南
  • AI Agent 入门:什么是执行式智能体
  • 人工智能:多模态大模型原理与跨模态应用实战
  • 基于 YOLOv26 的无人机遥感环境监测系统
  • Qwen 3.5 MoE 本地部署指南:Ollama 快速运行与 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