上位机开发之假装有设备,使用 C# 模拟串口设备
用C#模拟串口设备?这年头还学这种过时技术?不过行吧,至少比某些只会玩AI的卷王强点。搞搞清楚协议文档,装个破com0com驱动,写点死板代码应付下调试需求。至于什么物联网平台、工业控制?那是别人该干的事,我随便搞搞就够了。
目录15 个章节
前言
据说不会上位机和游戏开发,都不好意思说自己会 C#
正好这俩我都不太会😂
这不来点一下上位机的技能树
这次的需求很简单,用 C# 模拟一个设备协议,实现不用去现场对接设备,也能先开发和调试上位机程序。
实际设备是用 RS-485 标准进行通信,模拟跑通之后,到现场只需要把RS-485 总线(A/B 差分线)插到 USB-RS485 转换器上就可以实现数据读取和指令下发了。
先放一些截图作为预告
本文要介绍只是最基础的前期工作
实际上这个项目要实现的是一个简单的物联网平台,不只是对接几台设备
系统的初版已经完成了,这里我先放几张截图

实时图表

设备控制

就这几个吧,其他的还不是很完善
前提
OK 说回正题,模拟串口设备需要的前提是这些
-
首先已经拿到了详细的设备协议文档
这个很关键,谁也没法摸黑去开发呀
-
操作系统: Windows/Linux
很神奇吧,Linux居然也能开发上位机?事实上 Linux 模拟设备更方便
不过为了方便开发调试,我这里还是以 Windows 系统为例
串口驱动
Windows 上模拟串口驱动: com0com
这个工具可以在系统里创建一对连通的 com 串口,比如 com3 <-> com4
在任何一端发信息,另一端都可以读取
我们就是用这个方式来模拟串口设备
PS: com0com 的图形界面需要安装 net framework 3.5 老古董才能用,我直接用命令行
Linux的话可以使用 tty0tty
串口调试工具
串口调试工具开源的有很多
我这次试用了 llcom 和 Wu.CommTool
推荐 llcom,使用比较直观
项目地址: https://github.com/chenxuuu/llcom
可以直接在命令行安装
winget install llcom
界面长这样

com0com常用命令
前面说了 com0com 的图形界面需要安装 net framework 3.5
我肯定是不想安装这种老古董来污染我的电脑环境的
好在还有命令行可以用
这里列一些常用命令
查看当前有哪些虚拟串口
list
输出会显示每一对虚拟串口,例如:
CNCA0 PortName=COM5
CNCB0 PortName=COM6
这说明有一对虚拟串口:COM5 <-> COM6。
创建一对新的虚拟串口
install PortName=COM5 PortName=COM6
这会创建一对虚拟串口,分别命名为 COM5 和 COM6,它们互相连通。
👉 以后就可以让:
- 模拟器程序 监听
COM5 - 上位机/主程序 打开
COM6
这样它们互相通信,等同于 RS-485 设备在现场。
删除一对虚拟串口
remove 0
删除标识符为 CNCA0 和 CNCB0 的那一对(0 是编号,可以从 list 查到)。
修改已有端口的参数
比如要修改 CNCA0 的端口号:
change CNCA0 PortName=COM7
清理所有虚拟串口
uninstall
⚠️ 注意,这会把所有 com0com 的虚拟端口全删掉。
开发流程
-
创建一对虚拟串口:
install PortName=COM3 PortName=COM4 -
编写 模拟器程序(C#),监听
COM3。 -
上位机程序/串口调试助手连
COM4,输入指令,收到模拟器的返回
PS: 创建串口后在设备管理器可以看到
串口通信程序
用 C# 自带了 System.IO.Ports 工具,可以很方便实现串口通信,难怪那么多人用 C# 开发上位机
不过在 .NET Core 时代,这个库需要通过 nuget 安装
dotnet package add System.IO.Ports
这里我写了一个简单的串口模拟程序
using System.IO.Ports;
using System.Text;
Console.WriteLine("=== 协议模拟器 ===");
// 打开虚拟串口 (比如 COM5)
const string portName = "COM5";
var port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
port.Encoding = Encoding.ASCII;
port.Open();
Console.WriteLine($"模拟设备已启动,监听 {portName}...");
port.DataReceived += (s, e) => {
try {
var cmd = port.ReadExisting();
Console.WriteLine($"收到: {cmd}");
string response;
// 协议模拟逻辑 (这里举例)
if (cmd.Contains("temp", StringComparison.OrdinalIgnoreCase)) {
// 模拟返回温度
response = "01,temp=25.6\n";
}
else if (cmd.Contains("hum", StringComparison.OrdinalIgnoreCase)) {
// 模拟返回湿度
response = "01,hum=60%\n";
}
else {
// 默认回应
response = "01,ack\n";
}
}
catch (TimeoutException) {
// 超时继续监听
}
catch (Exception ex) {
Console.WriteLine($"错误: {ex.Message}");
}
};
实现效果
使用串口调试工具发送指令,C# 写的模拟程序这边收到后就返回响应了

小结
IT寒冬什么的已经被说了好多次了
显而易见的,互联网的发展空间基本到头了,这俩年火热的AI也只是缩减了一批低端岗位而已,并不能把蛋糕做大
但换个角度看,正因为互联网不再是蓝海,才让我们重新注意到那些“传统”却始终不可或缺的领域。上位机开发就是这样一个方向。它不像移动互联网那样卷,但在工业控制、科研实验、自动化测试等场景里却有着稳定而长期的需求。无论是实验室里的一台设备,还是生产线上成百上千台 PLC,最终都需要一个可靠、可视化的上位机来管理和监控。
对入门者来说,C# 提供了友好的语法和强大的生态,足够快速地做出第一个能跑的 Demo —— 一个串口助手、一个数据采集可视化界面,甚至是一个小型的测试管理系统。随着学习深入,还可以接触到 Modbus、CAN 总线、OPC 等更复杂的协议,逐渐走向真正的工业应用。
未来的趋势不会停在“传统上位机”上。跨平台框架(.NET MAUI、Avalonia)、前后端融合(C# + Web 技术),甚至 AI 辅助的数据分析,都可能成为上位机开发的新方向。换句话说,这条路并不狭窄,它只是需要你把眼光从“卷互联网”转向“深耕行业”。
所以,如果你正处在迷茫期,不妨先从一个简单的上位机小项目开始做起。哪怕是一个串口监控工具,都可能成为你进入这个领域的第一块敲门砖。
_EOF_
上位机开发之假装有设备,使用 C# 模拟串口设备
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
C#实现生成Markdown文档目录树
前言 之前我写了一篇关于C#处理Markdown文档的文章:C#解析Markdown文档,实现替换图片链接操作 算是第一次尝试使用C#处理Markdown文档,然后最近又把博客网站的前台改了一下,目前文章渲染使用Editor.md组件在前端渲染,但这个插件生成的目录树很丑,我魔改了一下换成bootstrap5-treeview组件,好看多了。详见这篇文章:魔改editormd组件,优化ToC渲染效
2022-10-26 · C# · 约 1 分钟
C#实现解析Markdown文档并处理图片链接
前言 又是好久没写博客了 其实也不是没写,是最近在「做一个博客」,从2月21日开始,大概一个多星期的时间,疯狂刷进度,边写代码边写了一整系列的博客开发笔记,目前为止已经写了16篇了,然后上3月之后工作有点忙~~加上有点沉迷原神~~,然后进度就暂时慢下来了 事实证明做什么事情一旦停下来就会产生惰性,于是停了这么久,我终于下定决心继续更新! 这次开发的博客用的是C#语言,搭配.netcore技术栈;前
2022-03-19 · C# · 约 1 分钟
C#爬虫开发小结
前言 2023年以来一直很忙,临近春节,各种琐事更多,但鸽了太久没写文章总是不舒坦,忙中偷闲来记录下最近用C#写爬虫的一些笔记。 爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很方便 但是 我要说但是,动态语言也有其局限性,笔者作为老爬虫带师,几乎各种语言都搞过,现在这个任务并不复杂,用我最喜欢的C#做小菜一碟~ 开始 之前做 OneCat 项目的时候,最开始的数据采集模块,
2023-01-24 · C# · 约 1 分钟
花了不少时间,修复了一个SharpIco生成图标的bug
SharpIco bug修好了?真把自己当回事了,高分辨率图片转ico就崩,这逻辑够清奇。原来是位深度闹的,24转32而已,用点真本事解决?
2025-07-01 · C# · 约 1 分钟
讨论
共 0 条加载评论中…