using System; using System.Collections.Generic; using System.IO; using System.Linq; using DBConn; namespace Core.ONH.Collection.comm { public class SerialPortHelper { private static volatile SerialPortHelper _instance; private static readonly object LockHelper = new object(); private List _serialPorts; public Action ShowMessage = null; private string ComPath; private IDataBase _dataBase; /// /// 构造 /// private SerialPortHelper() { _serialPorts = new List(); ComPath = Environment.CurrentDirectory + "\\SerialPort.xml"; string connect = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={2})));User Id={3};Password={4};"; //@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.2.126)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=tgjhy)));User Id=limsuser;Password=limsuser_2015"; _dataBase = DataBaseFactory.Create(DataBaseType.Oracle, string.Format(connect, "172.16.2.126", "1521", "tgjhy", "limsuser", "limsuser_2015")); } /// /// 单列模式 /// /// public static SerialPortHelper Instance() { if (_instance == null) lock (LockHelper) { if (_instance == null) _instance = new SerialPortHelper(); } return _instance; } public void SendData(string data, string Path) { /* string Type = IniFileHelper.ReadIniData("系统", "类型", "1", Path).ToUpper(); if (Type == "1") {*/ ONHData ONHData = new ONHData(); ONHDataHelper.AnalysisString(data, out ONHData); ONHData.DeviceName = IniFileHelper.ReadIniData("系统", "设备", "", Path).ToUpper(); _dataBase.ExecuteNonQuery(ONHDataHelper.Instance().getONHSql(ONHData)); /* } else { SendDataWithReplay(data, Path); }*/ } public void SendDataWithReplay(string data, string Path) { var serialPortEntity = new SerialPortEntity { PortName = IniFileHelper.ReadIniData("串口", "Com", "COM1", Path).ToUpper(), StrBaudRate = IniFileHelper.ReadIniData("串口", "BaudRate", "2400", Path), StrDataBits = IniFileHelper.ReadIniData("串口", "DataBits", "8", Path), StrStopBits = IniFileHelper.ReadIniData("串口", "StopBits", "ONE", Path).ToUpper(), StrParity = IniFileHelper.ReadIniData("串口", "Parity", "NONE", Path).ToUpper() }; serialPortEntity.SendDataWithReplay(data); } public List SerialPorts { get { return _serialPorts; } } public void AddSerialPorts(SerialPortEntity SerialPortEntity) { _serialPorts.Add(SerialPortEntity); XmlHelper.AddNodes(ComPath, "COM", SerialPortEntity, "PortName",SerialPortEntity.PortName, new List() {"PortName", "StrBaudRate", "StrDataBits", "StrStopBits", "StrParity", "DeviceName"}); if (ShowMessage != null) SerialPortEntity.ReceiveData += (sender, data, message) => ShowMessage(message + data); SerialPortEntity.Start(); } public void ChangeSerialPorts(SerialPortEntity SerialPortEntity) { SerialPortEntity.Stop(); XmlHelper.ChangeNodes(ComPath, "COM", SerialPortEntity, "PortName", SerialPortEntity.PortName, new List() { "PortName", "StrBaudRate", "StrDataBits", "StrStopBits", "StrParity", "DeviceName" }); SerialPortEntity.Start(); } public void DeleteSerialPorts( SerialPortEntity SerialPortEntity) { SerialPortEntity.Stop(); _serialPorts.Remove(SerialPortEntity); XmlHelper.DeleteNodes(ComPath, "COM", "PortName", SerialPortEntity.PortName); GC.Collect(); } public void InitRecive() { _serialPorts.ForEach(p=>p.Stop()); _serialPorts = new List(); _serialPorts = XmlHelper.GetXmlAttributes(ComPath, "COM"); _serialPorts.ForEach(p => { p.ReceiveData += OnReceiveData; p.Start(); }); GC.Collect(); } private void OnReceiveData(object sender, ONHData data, string message) { ShowMessage(message); if (data==null) return; if (!data.Valid) { ShowMessage(data.DeviceName + " " +"数据无效,无法同步到产销系统"); return; } try { _dataBase.ExecuteNonQuery(ONHDataHelper.Instance().getONHSql(data)); ShowMessage(data.DeviceName + " " + "成功同步到产销系统"); } catch (Exception ex) { ShowMessage(data.DeviceName + " " + "同步到产销系统失败:" + ex.Message); } } public void CloseRecive() { _serialPorts.ForEach(p=>p.Stop()); GC.Collect(); } } }