Files
DevToolsAvalonia/常用工具集/Utility/Network/Modbus/SharpSerial/SerialSettings.cs
2025-08-26 08:37:44 +08:00

142 lines
4.4 KiB
C#

using System;
using System.IO.Ports;
using System.Globalization;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace SharpSerial
{
public class SerialSettings
{
public SerialSettings() => CopyProperties(new SerialPort(), this);
public SerialSettings(string portName) => CopyProperties(new SerialPort(portName), this);
public SerialSettings(object source) => CopyProperties(source, this);
public void CopyFrom(object source) => CopyProperties(source, this);
public void CopyTo(object target) => CopyProperties(this, target);
[TypeConverter(typeof(PortNameConverter))]
public string PortName { get; set; }
[TypeConverter(typeof(BaudRateConverter))]
public int BaudRate { get; set; }
public int DataBits { get; set; }
public Parity Parity { get; set; }
public StopBits StopBits { get; set; }
public Handshake Handshake { get; set; }
public static void CopyProperties(Object source, Object target)
{
CopyProperty(source, target, "PortName");
CopyProperty(source, target, "BaudRate");
CopyProperty(source, target, "DataBits");
CopyProperty(source, target, "Parity");
CopyProperty(source, target, "StopBits");
CopyProperty(source, target, "Handshake");
}
static void CopyProperty(Object source, Object target, string name)
{
var propertySource = source.GetType().GetProperty(name);
var propertyTarget = target.GetType().GetProperty(name);
propertyTarget.SetValue(target, propertySource.GetValue(source, null), null);
}
}
public class PortNameConverter : TypeConverter
{
//windows only?
private readonly Regex re = new Regex(@"[^a-zA-Z0-9_]");
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(SerialPort.GetPortNames());
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (sourceType == typeof(string));
}
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value)
{
if (re.IsMatch(value.ToString())) throw Tools.Make("Invalid chars");
return value;
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
return value;
}
}
public class BaudRateConverter : TypeConverter
{
public readonly static int[] BaudRates = new int[] {
110,
300,
600,
1200,
2400,
4800,
9600,
14400,
19200,
28800,
38400,
56000,
57600,
115200,
128000,
153600,
230400,
256000,
460800,
921600
};
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(BaudRates);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (sourceType == typeof(string));
}
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value)
{
return int.Parse(value.ToString());
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
return value.ToString();
}
}
}