Halcon图像处理实战:C++与C#双语言实现指针获取与图像生成(附完整代码)
2026/4/16 18:58:24
提供一个基于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: 基本发送与接收 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模拟器已停止扩展建议
环境依赖
这个实现提供了基本的COM口模拟功能,适合测试和开发场景。如需更复杂的功能,可根据需求扩展。
串口通信协议
串口调试工具