他的回复:
.Net Core下SerailPort串口编程.Net下串口编程变得非常简单,因为内置了SerialPort组件。跨平台的.Net Core可以在Linux下使用,包括类似树莓派这样的设备提供一个可运行的demopublic class SerialPortService { private readonly SerialPort _SerialPort; /// /// 返回卡号和COM口 /// private Action _Callback; private readonly string _PortName; /// /// 端口是否打开 /// public bool IsOpen => _SerialPort.IsOpen; /// /// 由于设备被拔出等原因,重新打开 /// /// public bool ReStart() { if (_SerialPort != null && !_SerialPort.IsOpen && _Callback != null && _PortName != string.Empty) { _SerialPort.Open(); _SerialPort.DiscardInBuffer(); return true; } else return false; } /// /// 初始化 /// /// 端口号 /// 波特率 /// 数据位长度 /// 停止位数 /// 奇偶校验 public SerialPortService(string portName, int baudrate = 9600, int databits = 8, StopBits stopbit = StopBits.One, Parity parity = Parity.None) { _PortName = portName; _SerialPort = new SerialPort(portName) { Parity = parity,// Parity.None, BaudRate = baudrate,// 9600, DataBits = databits,//8, StopBits = stopbit,//StopBits.One, DiscardNull = true }; _SerialPort.DataReceived += SerialPort_DataReceived; } /// /// 打卡端口监听,并回调返回数据 /// /// 回调事件(卡号,端口号) /// 成功返回ok,失败返回错误信息 public string Start(Action action) { _Callback = action; string result = "Success"; try { _SerialPort.Open(); _SerialPort.DiscardInBuffer(); } catch (Exception ex) { result = ex.Message; } return result; } public void Stop() { if (_SerialPort.IsOpen) _SerialPort.Close(); } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { var data = _SerialPort.ReadExisting(); if (data.Length > 11) { data = data.Substring(1, 10); if (int.TryParse(data, out int tmp)) { _Callback(tmp.ToString("X8"), _PortName); } } } }使用起来很简单var sp = new SerialPortService("COM10"); sp.Start((cardno, port) => { Console.WriteLine(cardno); });当端口有数据,将会被输出本场景是针对ID卡打卡获取ID卡号