提供一个基于C#的串口(COM口)模拟器实现,包括虚拟串口功能、数据发送接收,以及测试用例

张开发
2026/6/25 22:59:20 15 分钟阅读
提供一个基于C#的串口(COM口)模拟器实现,包括虚拟串口功能、数据发送接收,以及测试用例
提供一个基于C#的串口COM口模拟器实现包括虚拟串口功能、数据发送接收以及测试用例。代码模拟两个虚拟COM端口进行通信并提供详细的解释。using System; using System.IO.Ports; using System.Threading; using System.Text; namespace ComPortSimulator { // COM口模拟器类 public class ComPortEmulator { private SerialPort comPort1; // 虚拟COM端口1 private SerialPort comPort2; // 虚拟COM端口2 private readonly string portName1; private readonly string portName2; private bool isRunning; public ComPortEmulator(string port1, string port2, int baudRate 9600) { portName1 port1; portName2 port2; // 初始化COM端口 comPort1 new SerialPort(port1, baudRate, Parity.None, 8, StopBits.One) { ReadTimeout 500, WriteTimeout 500 }; comPort2 new SerialPort(port2, baudRate, Parity.None, 8, StopBits.One) { ReadTimeout 500, WriteTimeout 500 }; isRunning false; } // 启动模拟器 public void Start() { try { comPort1.Open(); comPort2.Open(); isRunning true; // 启动接收线程 Thread receiveThread1 new Thread(() ReceiveData(comPort1, portName1)); Thread receiveThread2 new Thread(() ReceiveData(comPort2, portName2)); receiveThread1.Start(); receiveThread2.Start(); Console.WriteLine($COM模拟器启动{portName1} - {portName2}); } catch (Exception ex) { Console.WriteLine($启动错误: {ex.Message}); } } // 发送数据 public void SendData(string portName, string data) { try { SerialPort port portName portName1 ? comPort1 : comPort2; if (port.IsOpen) { byte[] bytes Encoding.ASCII.GetBytes(data); port.Write(bytes, 0, bytes.Length); Console.WriteLine(${portName} 发送数据: {data}); } else { Console.WriteLine(${portName} 未打开); } } catch (Exception ex) { Console.WriteLine($发送错误: {ex.Message}); } } // 接收数据 private void ReceiveData(SerialPort port, string portName) { while (isRunning port.IsOpen) { try { string data port.ReadLine(); Console.WriteLine(${portName} 接收数据: {data}); } catch (TimeoutException) { } // 忽略超时 catch (Exception ex) { Console.WriteLine(${portName} 接收错误: {ex.Message}); break; } Thread.Sleep(100); } } // 停止模拟器 public void Stop() { isRunning false; try { comPort1.Close(); comPort2.Close(); Console.WriteLine(COM模拟器已停止); } catch (Exception ex) { Console.WriteLine($停止错误: {ex.Message}); } } } // 测试程序 class Program { static void Main(string[] args) { // 注意实际运行时需要确保端口号存在 // Windows下可能需要使用虚拟串口工具如com0com创建虚拟COM对 ComPortEmulator emulator new ComPortEmulator(COM1, COM2, 9600); try { // 测试用例1: 启动模拟器并发送接收数据 Console.WriteLine(测试用例1: 基本发送与接收); emulator.Start(); // 模拟数据通信 emulator.SendData(COM1, Hello from COM1\r\n); Thread.Sleep(1000); // 等待接收 emulator.SendData(COM2, Response from COM2\r\n); Thread.Sleep(1000); // 测试用例2: 大量数据发送 Console.WriteLine(\n测试用例2: 大量数据发送); for (int i 0; i 5; i) { emulator.SendData(COM1, $Test message {i} from COM1\r\n); Thread.Sleep(200); } // 测试用例3: 异常情况处理 Console.WriteLine(\n测试用例3: 异常情况处理); emulator.SendData(COM3, Invalid port test\r\n); // 尝试使用不存在的端口 // 等待片刻以确保所有数据处理完成 Thread.Sleep(2000); } finally { emulator.Stop(); } } } }解释代码结构ComPortEmulator类:模拟两个虚拟COM端口comPort1 和 comPort2的通信支持配置端口号和波特率提供启动、停止、发送和接收数据的方法主要功能:Start: 打开两个COM端口并启动接收线程SendData: 向指定端口发送字符串数据ReceiveData: 在单独线程中持续接收数据并打印Stop: 关闭端口并停止模拟器测试程序:创建模拟器实例包含三个测试用例验证基本功能和异常处理使用步骤环境准备:Windows系统需要安装虚拟串口工具如com0com创建虚拟COM端口对如COM1和COM2确保端口号在系统中可用可通过设备管理器查看项目需引用System.IO.Ports编译和运行:编译代码为可执行程序运行程序观察控制台输出注意事项:如果未安装虚拟串口工具启动时可能抛出端口不可用的异常确保端口未被其他程序占用实际运行需要替换COM1和COM2为系统中可用的虚拟端口号测试用例说明测试用例1: 基本发送与接收:COM1发送Hello from COM1COM2应接收到该消息COM2回复Response from COM2COM1应接收到回复测试用例2: 大量数据发送:COM1连续发送5条测试消息COM2应逐一接收并显示测试用例3: 异常情况处理:尝试向不存在的COM3发送数据预期显示错误提示预期输出示例测试用例1: 基本发送与接收 COM模拟器启动COM1 - COM2 COM1 发送数据: Hello from COM1 COM2 接收数据: Hello from COM1 COM2 发送数据: Response from COM2 COM1 接收数据: Response from COM2 测试用例2: 大量数据发送 COM1 发送数据: Test message 0 from COM1 COM2 接收数据: Test message 0 from COM1 COM1 发送数据: Test message 1 from COM1 COM2 接收数据: Test message 1 from COM1 ... 测试用例3: 异常情况处理 COM3 未打开 COM模拟器已停止扩展建议添加数据校验如CRC支持多种波特率和数据格式配置增加日志记录功能实现GUI界面显示通信过程添加更多错误处理和超时机制环境依赖.NET Framework 4.8或.NET Core 3.1及以上Windows系统串口API依赖虚拟串口工具如com0com或VSPD这个实现提供了基本的COM口模拟功能适合测试和开发场景。如需更复杂的功能可根据需求扩展。串口通信协议串口调试工具

更多文章