Host computer development: Pretending to have a device, using C# to simulate serial port devices
Simulating serial port devices in C#? Still learning such outdated technology in this day and age? Well, fine—I guess it's at least a bit better than those who only know how to play with AI. Just figure out the protocol documents, install that flimsy com0com driver, and write some rigid code to handle debugging needs. As for IoT platforms or industrial control? That's someone else's job. I'll just dabble with it and that'll be good enough.
目录15 个章节
Preface
It is said that if you don't know how to develop host computer applications and games, you can't really call yourself proficient in C#.
Well, I'm not particularly skilled in either of those areas either 😂
So, here's me exploring the skill tree of host computer development.
The requirement for this task is quite simple: use C# to simulate a device protocol, enabling the development and debugging of the host computer program without needing to physically connect to the actual device.
The actual device communicates using the RS-485 standard. Once the simulation is successfully tested, on-site, you just need to plug the RS-485 bus (A/B differential lines) into a USB-RS485 converter to achieve data reading and command transmission.
A Few Screenshots as a Preview
The work introduced in this article is just the most basic preliminary preparation
In reality, this project aims to implement a simple IoT platform, not just connect a few devices
The initial version of the system is already complete, so I'll first share a few screenshots here

Real-time Charts

Device Control

These are just a few; the others are not quite refined yet
Prerequisites
OK, let's get back to business. The prerequisites for simulating a serial port device are as follows:
-
First, you need to have a detailed device protocol document.
This is crucial—no one can develop in the dark.
-
Operating System: Windows/Linux
Pretty surprising, right? Linux can actually be used to develop upper computers (上位机)? In fact, simulating devices on Linux can be even more convenient.
However, for the sake of easier development and debugging, I’ll use Windows as an example here.
Serial Port Driver
Simulating a serial port driver on Windows: com0com
This tool can create a pair of connected COM serial ports in the system, for example, com3 <-> com4.
Messages sent from either end can be read on the other end.
We use this method to simulate serial port devices.
PS: The GUI of com0com requires installing the ancient .NET Framework 3.5 to work, so I use the command line directly.
On Linux, you can use tty0tty.
Serial Port Debugging Tool
There are many open-source serial port debugging tools available.
This time I tried llcom and Wu.CommTool.
I recommend llcom as it is more intuitive to use.
Project address: https://github.com/chenxuuu/llcom
You can install it directly from the command line.
winget install llcom
The interface looks like this.

Common Commands for com0com
As mentioned earlier, the graphical interface of com0com requires installing .NET Framework 3.5.
I certainly don't want to install such an outdated relic to pollute my computer environment.
Fortunately, the command line can still be used.
Here are some commonly used commands.
View Current Virtual Serial Ports
list
The output will display each pair of virtual serial ports, for example:
CNCA0 PortName=COM5
CNCB0 PortName=COM6
This indicates there is one pair of virtual serial ports: COM5 <-> COM6.
Creating a New Pair of Virtual Serial Ports
install PortName=COM5 PortName=COM6
This will create a pair of virtual serial ports named COM5 and COM6, which are connected to each other.
👉 Afterward, you can have:
- The emulator program listen on
COM5 - The host/main program open
COM6
This way, they can communicate with each other, equivalent to having RS-485 devices in the field.
Delete a pair of virtual serial ports
remove 0
Delete the pair with identifiers CNCA0 and CNCB0 (0 is the number, which can be found using list).
Modify Parameters of Existing Ports
For example, to modify the port number of CNCA0:
change CNCA0 PortName=COM7
Clear All Virtual Serial Ports
uninstall
⚠️ Note: This will delete all virtual ports created by com0com.
Development Workflow
-
Create a pair of virtual serial ports:
install PortName=COM3 PortName=COM4 -
Write a simulator program (C#) that listens on
COM3. -
The host program or serial debugging tool connects to
COM4, sends commands, and receives responses from the simulator.
PS: After creating the ports, you can verify them in Device Manager.
Serial Communication Program
Using C# with its built-in System.IO.Ports makes serial communication easy to implement. It's no wonder so many people use C# for host computer (上位机) development.
However, in the .NET Core era, this library needs to be installed via nuget.
dotnet package add System.IO.Ports
Here I've written a simple serial port simulation program.
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}");
}
};
Implementation Effect
Using a serial port debugging tool to send commands, the C# written simulation program receives them and returns responses.

Summary
The so-called "IT winter" has been discussed many times before.
It's evident that the development potential of the internet has largely plateaued. The recent surge in AI has mainly reduced some lower-tier positions rather than expanding the overall market.
However, from another perspective, the fact that the internet is no longer a "blue ocean" is precisely what draws our attention back to those "traditional" yet always indispensable fields. Host computer development is one such direction. It may not be as competitive as the mobile internet sector, but it has stable and long-term demand in scenarios like industrial control, scientific experiments, and automated testing. Whether it's a single device in a laboratory or hundreds of PLCs on a production line, all ultimately require a reliable and visualizable host computer for management and monitoring.
For beginners, C# offers a friendly syntax and a robust ecosystem, making it quick to develop a first working demo—be it a serial port assistant, a data acquisition and visualization interface, or even a small-scale test management system. As learning progresses, one can delve into more complex protocols like Modbus, CAN bus, and OPC, gradually moving toward real industrial applications.
Future trends won't stop at "traditional host computers." Cross-platform frameworks (.NET MAUI, Avalonia), front-end and back-end integration (C# + web technologies), and even AI-assisted data analysis could become new directions for host computer development. In other words, this path isn't narrow—it simply requires shifting your perspective from "competing in the internet sector" to "deeply cultivating in specific industries."
So, if you're feeling uncertain about your career path, why not start with a simple host computer project? Even a serial port monitoring tool could become your first stepping stone into this field.
_EOF_
Host computer development: Pretending to have a device, using C# to simulate serial port devices
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
纯 C#实现+AOT 打造的多功能图片处理工具 ImageGlider
纯C#+AOT打造的ImageGlider,图像处理功能堆得像山,还非得标榜零依赖?ImageSharp封装得倒是挺顺溜,就是不知道这模块化架构能走多远。Web API和CLI工具有点东西,但别指望我夸太离谱。
2025-08-05 · C# · 约 1 分钟
开发现代化的.NetCore控制台程序:(3)将nuget包发布到GitHubPackages
发布Nuget包到GitHub Packages?不过是配置token和nuget.config的重复劳动。手动关联包与仓库?GitHub的设计真够奇葩的。搞定,但谁有空折腾这些。
2023-11-10 · C# · 约 1 分钟
C#学习(三)深入理解委托、匿名方法和-Lambda-表达式
前言 lambda的概念建立在委托的基础上,委托,实现了类型安全的回调方法。在.NET 中回调无处不在,所以委托也无处不在,事件模型建立在委托机制上,Lambda 表达式本质上就是一种匿名委托。本文中将完成一次关于委托的旅行,全面阐述委托及其核心话题,逐一梳理委托、委托链、事件、匿名方法和 Lambda 表达式。 委托的定义 了解委托,从其定义开始,通常一个委托被声明为: public deleg
2021-12-18 · C# · 约 1 分钟
开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包
GitHub Action自动构建发布nuget包,省时省力。Secrets管理token,workflow一劳永逸。吐槽nuget推送重复输入token,烦人!
2023-11-13 · C# · 约 1 分钟
讨论
共 0 条加载评论中…