前言

据说不会上位机和游戏开发,都不好意思说自己会 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

https://github.com/freemed/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

这会创建一对虚拟串口,分别命名为 COM5COM6,它们互相连通。

以后就可以让:

  • 模拟器程序 监听 COM5
  • 上位机/主程序 打开 COM6

这样它们互相通信,等同于 RS-485 设备在现场。

删除一对虚拟串口

remove 0

删除标识符为 CNCA0CNCB0 的那一对(0 是编号,可以从 list 查到)。

修改已有端口的参数

比如要修改 CNCA0 的端口号:

change CNCA0 PortName=COM7

清理所有虚拟串口

uninstall

️ 注意,这会把所有 com0com 的虚拟端口全删掉。

开发流程

  1. 创建一对虚拟串口:

    install PortName=COM3 PortName=COM4
  2. 编写 模拟器程序(C#),监听 COM3

  3. 上位机程序/串口调试助手连 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 辅助的数据分析,都可能成为上位机开发的新方向。换句话说,这条路并不狭窄,它只是需要你把眼光从“卷互联网”转向“深耕行业”。

所以,如果你正处在迷茫期,不妨先从一个简单的上位机小项目开始做起。哪怕是一个串口监控工具,都可能成为你进入这个领域的第一块敲门砖。

上位机开发之假装有设备,使用 C# 模拟串口设备的更多相关文章

  1. Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发

    1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...

  2. USBCAN的使用和上位机开发(MFC)

    USBCAN使用手册 参见:https://blog.51cto.com/12572800/2062839 1. USB CAN软件安装与硬件接线 USB CAN是常用的CAN测试工具.它的软件资料存 ...

  3. 上位机开发之三菱Q系列PLC通信实践

    经常关注我们公众号或者公开课的学员(如果还没有关注的话,左上角点击一波关注)应该知道,我们会经常使用西门子PLC,其实对于其他品牌的PLC,我们都会讲到,包括三菱.欧姆龙.基恩士.松下及国产台达.信捷 ...

  4. 上位机开发之三菱FX3U以太网通信实践

    上次跟大家介绍了一下上位机与三菱Q系列PLC通信的案例,大家可以通过点击这篇文章:上位机开发之三菱Q系列PLC通信实践(←戳这里) 今天以三菱FX3U PLC为例,跟大家介绍一下,如何实现上位机与其之 ...

  5. 上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  6. 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现

    说明:1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以.2.并且成功将emWin人性化,可以做些Windows系统上的 ...

  7. C#上位机开发(二)—— Hello,World

    上一篇大致了解了一下单片机实际项目开发中上位机开发部分的内容以及VS下载与安装,按照编程惯例,接下来就是“Hello,World!” 1.新建C#项目工程 首先选择新建Windows窗体应用(.NET ...

  8. 周立功USBCAN-II 上位机开发(MFC)

    使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件.例程和API文档等材料,可以参考. 1.库函数的调用 首先,把库函数文件都放在工作目录下.库函数文件总 ...

  9. 基于QT的全自动超声波焊接机上位机追溯系统(已经在设备上应用)

    应用说明: 本上位机程序是我在做锂电池产线项目的时候开发的,用于采集设备数据以及实现设备自动控制,下位机采用基恩士PLC,超声波机采用上海一家的超声波焊接机,实现电芯极耳的自动焊接,上位在设备焊接过程 ...

  10. 医疗器械c#上位机开发指引教程

    此教程面向的读者:对医疗器械上位机编程有兴趣,或者急需了解医疗器械(尿常规.血液分析.生化.心电.B超等医疗下位仪器)的编程流程.编程细节的程序员. 1.得到仪器协议 当我们需要与医疗器械等下位机数据 ...

随机推荐

  1. 终极指南:Scrum中如何设置需求优先级

    需求众多不知道如何下手?总想先做简单的需求,复杂需求却一拖再拖?那么,我们是时候开始考虑如何设置需求优先级了. 本期终极指南将展示如何为需求设置有效优先级,如何有效管理工作量,让效率指数倍增长,搭配  ...

  2. 团队如何限制合适的在制品(WIP)数量

    看板之父David Anderson曾说过" 看板的本质是一个很朴素的思想:在制品必须被限制."但对于团队来说,确定一个合适的在制品限制可能是件棘手的事. 在 <看板快速启动 ...

  3. MATLAB 打开报错:错误使用eval,未定义与‘struct‘类型的输入参数相对应的函数‘workspacefunc‘(MAC OS情况下)

    MAC OS情况下遇到这个问题比win会麻烦一点点 第一步:在Matlab中打开文件夹 打开文件夹/Volumes/自己的安装位置/MATLAB_R2022b.app/toolbox/local 第二 ...

  4. .NET 10 支持Linux 的Shebang(Hashbang)

    .NET 10 Preview 5 带来的C# 文件脚本化运行,在 Linux/Unix 系统中通过 #!/usr/bin/dotnet run 支持 Shebang(Hashbang) 的详细说明: ...

  5. TensorBoard使用报错

    TensorBoard使用报错 1.报错如下 Traceback (most recent call last): File "E:\AI_DP\xtd\3-Tensorboard用途.py ...

  6. 最受欢迎的三方库之harmony-utils

    harmony-utils(API12+) 简介与说明 harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用.其封装的工具 ...

  7. 【闲话 No.4】 wqs 二分

    你呀你呀 很好听的派蒙歌,6.1 要备战期末没法放歌所以在 5 月底放了每日一歌,希望可以让大家开心一些,也希望派蒙生日快乐! 你呀你呀 快给我休息一下 长了颗痘又 掉了好几根头发 怎么不说话 是不是 ...

  8. Kafka入门实战教程(5):吞吐量与可靠性的实践

    1 提高Producer吞吐量的实践 在实际环境中,用户似乎总是愿意用较小的延时增加的代价,去换取 TPS 的显著提升.毕竟,从 2ms 到 10ms 的延时增加通常是可以忍受的. 事实上,Kafka ...

  9. 层次分析法的Python实现--数学建模学习日志

    数学建模比赛即将到来,大家应该都投身于学习当中了,b站上比较热门的一个课程是 b站数学建模学习视频 在这里讲解了数学建模常见的方法和写论文的要点,同时up主贴心地有所有方法的源码实现,但是全部都是ma ...

  10. mysql递归查询(父级,子集)

    ①查询父级 表: 先给表创建函数: 1 CREATE FUNCTION `getParentList`(rootId varchar(100)) 2 RETURNS varchar(1000) 3 B ...