/// <summary> /// 应用端口配置,不包括端口名称 /// </summary> /// <param name="setting"></param> /// <param name="port"></param> public static SerialPort ApplySettings(this SerialPortSetting setting, SerialPort port) { if (port == null) { throw new ArgumentNullException(nameof(port)); } setting.ValidateSettings(); //保持 端口开关状态,如果已经打开,在结尾处重新打开该端口 var isOpened = port.IsOpen; if (isOpened) { port.Close(); } port.PortName = setting.PortName; port.BaudRate = setting.BaudRate; port.DataBits = setting.DataBits; port.Handshake = setting.Handshake; port.Parity = setting.Parity; port.StopBits = setting.StopBits; port.DtrEnable = setting.Dtr; port.RtsEnable = setting.Rts; //port.DsrHolding = true; if (isOpened) { port.Open(); } return(port); }
/// <summary> /// 检查端口是否可用 /// </summary> /// <param name="setting"></param> /// <returns></returns> public static bool Invaliable(this SerialPortSetting setting) { if (string.IsNullOrEmpty(setting?.PortName)) { return(false); } return(SerialPort.GetPortNames().Contains(setting.PortName) && setting.TryOpenPort()); }
/// <summary> /// 尝试打开端口 /// </summary> /// <param name="setting"></param> /// <returns></returns> private static bool TryOpenPort(this SerialPortSetting setting) { try { using (var port = setting.CreatePort()) { port.Open(); return(true); } } catch (Exception) { return(false); } }
/// <summary> /// 检查端口设置是否合法 /// </summary> /// <param name="setting"></param> private static void ValidateSettings(this SerialPortSetting setting) { if (string.IsNullOrEmpty(setting.PortName)) { throw new ArgumentException("Port Name not is Empty"); } if (!SerialPort.GetPortNames().Contains(setting.PortName)) { throw new ArgumentException($"Port Name {setting.PortName} is Invalid"); } }
/// <summary> /// 从串口对象实例获取参数 /// </summary> /// <param name="setting"></param> /// <param name="port"></param> public static SerialPortSetting AssignFrom(this SerialPortSetting setting, SerialPort port) { if (port == null) { throw new ArgumentNullException(nameof(port)); } setting.PortName = port.PortName; setting.BaudRate = port.BaudRate; setting.DataBits = port.DataBits; setting.Handshake = port.Handshake; setting.StopBits = port.StopBits; setting.Parity = port.Parity; setting.Dtr = port.DtrEnable; setting.Rts = port.RtsEnable; return(setting); }
public void ApplyPortSetting(SerialPortSetting setting) { this.PortSetting = setting; }
public SerialPortManager(SerialPortSetting setting) { this.PortSetting.AssignFrom(setting.ToString()); InitSerialPort(); }
/// <summary> /// 从CSV 字符串中读取串口配置 /// "COM1,9600,8,1,1" /// $"{settings.PortName},{settings.BaudRate},{settings.DataBits},{settings.StopBits},{settings.Parity}" /// </summary> /// <param name="setting"></param> /// <param name="settingParam"></param> /// <returns></returns> public static SerialPortSetting AssignFrom(this SerialPortSetting setting, string settingParam) { if (string.IsNullOrEmpty(settingParam)) { //返回默认值 return(setting); } if (string.Equals(setting.ToString(), settingParam)) { //setting 没有变化 return(setting); } if (settingParam.Contains(",")) { var values = settingParam.Split(','); for (int i = 0; i < values.Length; i++) { var val = values[i]; if (string.IsNullOrEmpty(val)) { continue; } switch (i) { case 0: setting.PortName = val; break; case 1: setting.SetProperty(s => s.BaudRate, val); break; case 2: setting.SetProperty(s => s.DataBits, val); break; case 3: setting.SetProperty(s => s.StopBits, val); break; case 4: setting.SetProperty(s => s.Parity, val); break; case 5: setting.SetProperty(s => s.Handshake, val); break; default: if (string.Equals(val, "DTR", StringComparison.CurrentCultureIgnoreCase)) { setting.Dtr = true; } if (string.Equals(val, "RTS", StringComparison.CurrentCultureIgnoreCase)) { setting.Rts = true; } break; } } } else { if (SerialPort.GetPortNames().Contains(settingParam)) { setting.PortName = settingParam; } } setting.RasieOnChanged(); return(setting); }