提供一个基于C#的串口(COM口)模拟器实现,包括虚拟串口功能、数据发送接收,以及测试用例
2026/4/16 17:02:09 网站建设 项目流程

提供一个基于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(); } } } }

解释代码结构

  1. ComPortEmulator类:
    • 模拟两个虚拟COM端口(comPort1 和 comPort2)的通信
    • 支持配置端口号和波特率
    • 提供启动、停止、发送和接收数据的方法
  2. 主要功能:
    • Start: 打开两个COM端口并启动接收线程
    • SendData: 向指定端口发送字符串数据
    • ReceiveData: 在单独线程中持续接收数据并打印
    • Stop: 关闭端口并停止模拟器
  3. 测试程序:
    • 创建模拟器实例
    • 包含三个测试用例,验证基本功能和异常处理

使用步骤

  1. 环境准备:
    • Windows系统需要安装虚拟串口工具(如com0com)创建虚拟COM端口对(如COM1和COM2)
    • 确保端口号在系统中可用(可通过设备管理器查看)
    • 项目需引用System.IO.Ports
  2. 编译和运行:
    • 编译代码为可执行程序
    • 运行程序,观察控制台输出
  3. 注意事项:
    • 如果未安装虚拟串口工具,启动时可能抛出端口不可用的异常
    • 确保端口未被其他程序占用
    • 实际运行需要替换COM1和COM2为系统中可用的虚拟端口号

测试用例说明

  1. 测试用例1: 基本发送与接收:
    • COM1发送"Hello from COM1"
    • COM2应接收到该消息
    • COM2回复"Response from COM2"
    • COM1应接收到回复
  2. 测试用例2: 大量数据发送:
    • COM1连续发送5条测试消息
    • COM2应逐一接收并显示
  3. 测试用例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模拟器已停止

扩展建议

  1. 添加数据校验(如CRC)
  2. 支持多种波特率和数据格式配置
  3. 增加日志记录功能
  4. 实现GUI界面显示通信过程
  5. 添加更多错误处理和超时机制

环境依赖

  • .NET Framework 4.8或.NET Core 3.1及以上
  • Windows系统(串口API依赖)
  • 虚拟串口工具(如com0com或VSPD)

这个实现提供了基本的COM口模拟功能,适合测试和开发场景。如需更复杂的功能,可根据需求扩展。

串口通信协议

串口调试工具

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询