| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Text;
 
- using System.Threading.Tasks;
 
- namespace YG.Device
 
- {
 
-     public class DeviceSerial : DeviceList
 
-     {
 
-         public override event RunMessage Msg;
 
-         public override event RunState rState;
 
-         System.IO.Ports.SerialPort serialPort;
 
-         private SendState sendState;
 
-         int SendCount = 0;
 
-         int leng = 0;
 
-         byte[] bt;
 
-         private bool _ison = false;
 
-         /// <summary>
 
-         /// 串口超时时间
 
-         /// </summary>
 
-         public override bool IsOn
 
-         {
 
-             get { return _ison; }
 
-             set
 
-             {
 
-                 if (_ison != value)
 
-                 {
 
-                     if (rState != null)
 
-                     {
 
-                         rState.Invoke(this.DeviceName, value); _ison = value;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         public override void DeviceState()
 
-         {
 
-             Task.Factory.StartNew(() =>
 
-             {
 
-                 while (true)
 
-                 {
 
-                     System.Threading.Thread.Sleep(1000);
 
-                     try
 
-                     {
 
-                         if (serialPort.IsOpen) { IsOn = true; }
 
-                         else { IsOn = false; serialPort.Open(); }
 
-                     }
 
-                     catch
 
-                     {
 
-                         IsOn = false;
 
-                         serialPort.Open();
 
-                     }
 
-                     finally
 
-                     {
 
-                     }
 
-                 }
 
-             });
 
-         }
 
-         /// <summary>
 
-         /// 
 
-         /// </summary>
 
-         /// <param name="portname">串口名称</param>
 
-         /// <param name="buard">波特率</param>
 
-         public DeviceSerial(string portname, int buard, int outtime = 2500)
 
-         {
 
-             serialPort = new System.IO.Ports.SerialPort(portname, buard);
 
-             serialPort.DataReceived += SerialPort_DataReceived;
 
-             serialPort.ReadTimeout = 100;
 
-             serialPort.WriteTimeout = 100;
 
-             timeout = outtime;
 
-             this.DeviceName = portname;
 
-         }
 
-         public override void DeviceCheck()
 
-         {
 
-             System.Threading.Thread.Sleep(timeout);
 
-             while (sendState == SendState.SendNoReceive)
 
-             {
 
-                 serialPort.Write(SendValue.ToString());
 
-                 base.DeviceSend(SendValue);
 
-                 //一般情况下在延迟一段时间之后, 如果没有收到串口反馈的指令,那么下次发送也很难再接受到反馈, 所以下边默认延迟1500毫秒
 
-                 System.Threading.Thread.Sleep(1500);
 
-                 SendCount++;
 
-                 if (SendCount > 3)
 
-                 {
 
-                     if (Msg != null)
 
-                     {
 
-                         Msg.Invoke(this.DeviceName, SendValue.Replace("\r", "").Replace("\n", ""), "连续发送三次数据没有得到回应");
 
-                         sendState = SendState.StartSend;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         public override void DeviceClose()
 
-         {
 
-             if (serialPort.IsOpen)
 
-                 serialPort.Close();
 
-             base.DeviceClose();
 
-         }
 
-         public override void DeviceInit()
 
-         {
 
-             sendState = SendState.StartSend;
 
-             IsOn = true;
 
-             IsOn = false;
 
-         }
 
-         public override void DeviceOpen()
 
-         {
 
-             try
 
-             {
 
-                 if (!serialPort.IsOpen)
 
-                     serialPort.Open();
 
-             }
 
-             catch
 
-             {
 
-                 YG.Log.Instance.WriteLogAdd(serialPort.PortName + "打开失败");
 
-                 System.Windows.Forms.MessageBox.Show(serialPort.PortName + "打开失败");
 
-             }
 
-             base.DeviceOpen();
 
-         }
 
-         public override void DeviceSend(object ob)
 
-         {
 
-             try
 
-             {
 
-                 SendCount = 0;
 
-                 SendValue = ob.ToString();
 
-                 serialPort.Write(ob.ToString());
 
-                 base.DeviceSend(ob);
 
-                 sendState = SendState.SendNoReceive;
 
-                 Task.Factory.StartNew(() =>
 
-                 {
 
-                     if (timeout > 0)
 
-                     {
 
-                         //  DeviceCheck();
 
-                     }
 
-                 });
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 Log.Instance.WriteLogAdd("串口打开失败:" + ex.Message);
 
-             }
 
-         }
 
-         private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
 
-         {
 
-             System.Threading.Thread.Sleep(50);
 
-             sendState = SendState.Received;
 
-             if (Msg != null)
 
-             {
 
-                 sendState = SendState.Received;
 
-                 // if (Msg != null)
 
-                 {
 
-                     leng = serialPort.BytesToRead;
 
-                     bt = new byte[leng];
 
-                     serialPort.Read(bt, 0, bt.Length);
 
-                     Task.Factory.StartNew(() => {
 
-                         Msg?.Invoke(this.DeviceName, SendValue.Replace("\r", "").Replace("\n", ""), Encoding.Default.GetString(bt)); });
 
-                     YG.Log.Instance.WriteLogAdd(string.Format("{0}:接受到信息{1}", serialPort.PortName, Encoding.Default.GetString(bt)));
 
-                 }
 
-                 // Msg.Invoke(this.DeviceName, serialPort.ReadLine());
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |