| 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());            }        }    }}
 |