C# SerialPort和ISerialServer的区别
SerialPort
来源:.NET Framework / .NET Core / .NET 5+ 自带的标准类。
命名空间:
System.IO.Ports.SerialPort
作用:用于直接访问和控制物理串口(COM端口),进行串口通信。
使用场景:当你需要与串口设备(如传感器、单片机、GPS模块等)通信时,使用
SerialPort
是最常见的方式。using System; using System.IO.Ports;class Program {static void Main(){SerialPort mySerialPort = new SerialPort("COM1");mySerialPort.BaudRate = 9600;mySerialPort.DataBits = 8;mySerialPort.Parity = Parity.None;mySerialPort.StopBits = StopBits.One;mySerialPort.Handshake = Handshake.None;mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);try{mySerialPort.Open();string msg = "Hello, World!";byte[] msgBuffer = Encoding.ASCII.GetBytes(msg);mySerialPort.Write(msgBuffer, 0, msgBuffer.Length);Console.WriteLine("Message sent.");}catch (Exception e){Console.WriteLine("Error: " e.Message);}finally{if (mySerialPort.IsOpen){mySerialPort.Close();}}}private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e){SerialPort sp = (SerialPort)sender;string indata = sp.ReadExisting();Console.WriteLine("Data Received:");Console.WriteLine(indata);} }
ISerialServer
来源:不是 .NET 自带的接口,通常是某个第三方库或项目自定义的接口。
作用:通常是一个抽象层,用于封装串口通信逻辑,可能是为了支持模拟串口、日志记录、测试、协议封装等功能。
使用场景:在某些架构中,为了解耦或支持多种通信方式(比如真实串口、虚拟串口、网络转发等),会定义一个
ISerialServer
接口,然后由不同实现类(如RealSerialServer
、MockSerialServer
)来实现。public interface ISerialServer {void Open(string portName, int baudRate);void Close();void Write(byte[] data);// 其他必要的方法和事件声明 }public class SerialServerImpl : ISerialServer {private SerialPort _serialPort = new SerialPort();public void Open(string portName, int baudRate){_serialPort.PortName = portName;_serialPort.BaudRate = baudRate;_serialPort.Open();}public void Close(){if (_serialPort.IsOpen){_serialPort.Close();}}public void Write(byte[] data){if (_serialPort.IsOpen){_serialPort.Write(data, 0, data.Length);}}// 实现其他必要的方法和事件 }
SerialPort和ISerialServer的区别
特性 | SerialPort | ISerialServer |
是否官方 | 是 | 否(通常是第三方或自定义) |
是否具体实现 | 是 | 是接口,需具体实现 |
是否用于串口通信 | 是 | 是,通常用于串口通信,但可扩展 |
是否可直接使用 | 是(可直接 new 使用) | 需要实现类 |
是否可模拟/测试 | 不支持(除非用虚拟串口) | 可轻松模拟(Mock) |
如果你只是做简单的串口通信,直接用
SerialPort
就够了。如果你在做一个大型系统,想解耦通信层、支持测试或模拟,可以定义一个
ISerialServer
接口,然后用SerialPort
实现它。