SerialPortHelper.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using DBConn;
  6. namespace Core.ONH.Collection.comm
  7. {
  8. public class SerialPortHelper
  9. {
  10. private static volatile SerialPortHelper _instance;
  11. private static readonly object LockHelper = new object();
  12. private List<SerialPortEntity> _serialPorts;
  13. public Action<string> ShowMessage = null;
  14. private string ComPath;
  15. private IDataBase _dataBase;
  16. /// <summary>
  17. /// 构造
  18. /// </summary>
  19. private SerialPortHelper()
  20. {
  21. _serialPorts = new List<SerialPortEntity>();
  22. ComPath = Environment.CurrentDirectory + "\\SerialPort.xml";
  23. 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};";
  24. //@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.2.126)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=tgjhy)));User Id=limsuser;Password=limsuser_2015";
  25. _dataBase = DataBaseFactory.Create(DataBaseType.Oracle, string.Format(connect, "172.16.2.126", "1521", "tgjhy", "limsuser", "limsuser_2015"));
  26. }
  27. /// <summary>
  28. /// 单列模式
  29. /// </summary>
  30. /// <returns></returns>
  31. public static SerialPortHelper Instance()
  32. {
  33. if (_instance == null)
  34. lock (LockHelper)
  35. {
  36. if (_instance == null)
  37. _instance = new SerialPortHelper();
  38. }
  39. return _instance;
  40. }
  41. public void SendData(string data, string Path)
  42. {
  43. /* string Type = IniFileHelper.ReadIniData("系统", "类型", "1", Path).ToUpper();
  44. if (Type == "1")
  45. {*/
  46. ONHData ONHData = new ONHData();
  47. ONHDataHelper.AnalysisString(data, out ONHData);
  48. ONHData.DeviceName = IniFileHelper.ReadIniData("系统", "设备", "", Path).ToUpper();
  49. _dataBase.ExecuteNonQuery(ONHDataHelper.Instance().getONHSql(ONHData));
  50. /* }
  51. else
  52. {
  53. SendDataWithReplay(data, Path);
  54. }*/
  55. }
  56. public void SendDataWithReplay(string data, string Path)
  57. {
  58. var serialPortEntity =
  59. new SerialPortEntity
  60. {
  61. PortName = IniFileHelper.ReadIniData("串口", "Com", "COM1", Path).ToUpper(),
  62. StrBaudRate = IniFileHelper.ReadIniData("串口", "BaudRate", "2400", Path),
  63. StrDataBits = IniFileHelper.ReadIniData("串口", "DataBits", "8", Path),
  64. StrStopBits = IniFileHelper.ReadIniData("串口", "StopBits", "ONE", Path).ToUpper(),
  65. StrParity = IniFileHelper.ReadIniData("串口", "Parity", "NONE", Path).ToUpper()
  66. };
  67. serialPortEntity.SendDataWithReplay(data);
  68. }
  69. public List<SerialPortEntity> SerialPorts
  70. {
  71. get { return _serialPorts; }
  72. }
  73. public void AddSerialPorts(SerialPortEntity SerialPortEntity)
  74. {
  75. _serialPorts.Add(SerialPortEntity);
  76. XmlHelper.AddNodes(ComPath, "COM", SerialPortEntity, "PortName",SerialPortEntity.PortName,
  77. new List<string>() {"PortName", "StrBaudRate", "StrDataBits", "StrStopBits", "StrParity", "DeviceName"});
  78. if (ShowMessage != null)
  79. SerialPortEntity.ReceiveData += (sender, data, message) => ShowMessage(message + data);
  80. SerialPortEntity.Start();
  81. }
  82. public void ChangeSerialPorts(SerialPortEntity SerialPortEntity)
  83. {
  84. SerialPortEntity.Stop();
  85. XmlHelper.ChangeNodes(ComPath, "COM", SerialPortEntity, "PortName", SerialPortEntity.PortName,
  86. new List<string>() { "PortName", "StrBaudRate", "StrDataBits", "StrStopBits", "StrParity", "DeviceName" });
  87. SerialPortEntity.Start();
  88. }
  89. public void DeleteSerialPorts( SerialPortEntity SerialPortEntity)
  90. {
  91. SerialPortEntity.Stop();
  92. _serialPorts.Remove(SerialPortEntity);
  93. XmlHelper.DeleteNodes(ComPath, "COM", "PortName", SerialPortEntity.PortName);
  94. GC.Collect();
  95. }
  96. public void InitRecive()
  97. {
  98. _serialPorts.ForEach(p=>p.Stop());
  99. _serialPorts = new List<SerialPortEntity>();
  100. _serialPorts = XmlHelper.GetXmlAttributes<SerialPortEntity>(ComPath, "COM");
  101. _serialPorts.ForEach(p =>
  102. {
  103. p.ReceiveData += OnReceiveData;
  104. p.Start();
  105. });
  106. GC.Collect();
  107. }
  108. private void OnReceiveData(object sender, ONHData data, string message)
  109. {
  110. ShowMessage(message);
  111. if (data==null) return;
  112. if (!data.Valid)
  113. {
  114. ShowMessage(data.DeviceName + " " +"数据无效,无法同步到产销系统");
  115. return;
  116. }
  117. try
  118. {
  119. _dataBase.ExecuteNonQuery(ONHDataHelper.Instance().getONHSql(data));
  120. ShowMessage(data.DeviceName + " " + "成功同步到产销系统");
  121. }
  122. catch (Exception ex)
  123. {
  124. ShowMessage(data.DeviceName + " " + "同步到产销系统失败:" + ex.Message);
  125. }
  126. }
  127. public void CloseRecive()
  128. {
  129. _serialPorts.ForEach(p=>p.Stop());
  130. GC.Collect();
  131. }
  132. }
  133. }