winfrom读取二维码扫描头的数据(串口通信)

    public class RQCodeComDevice
    {
        public delegate void EventHandleQRCode(string text);
        public event EventHandleQRCode DataReceivedQRCode;
 
        public SerialPort serialPort;
        Thread thread;
        volatile bool _keepReading;
 
        public RQCodeComDevice()
        {
            serialPort = new SerialPort();
            thread = null;
            _keepReading = false;
        }
 
        public bool IsOpen
        {
            get
            {
                return serialPort.IsOpen;
            }
        }
 
        private void StartReading()
        {
            if (!_keepReading)
            {
                _keepReading = true;
                thread = new Thread(new ThreadStart(ReadPort));
                thread.Start();
            }
        }
 
        private void StopReading()
        {
            if (_keepReading)
            {
                _keepReading = false;
                thread.Join();
                thread = null;
            }
        }
 
        private void ReadPort()
        {
            while (_keepReading)
            {
                try
                {
                    if (serialPort.IsOpen)
                    {
                        string gpsinfo = "";
                        READAGAIN:
                        int n = serialPort.BytesToRead;
                        byte[] buf = new byte[n];
                        
 
                        while (serialPort.BytesToRead > 0)
                        {
                            if (serialPort.Read(buf, 0, n) != 0)
                            {
                                String readstr = Encoding.UTF8.GetString(buf);
                                //Encoding encoding = System.Text.Encoding.GetEncoding("GB2312");
                                //String readstr = encoding.GetString(buf);
                                gpsinfo += readstr;
                            }
                        }
 
                        Thread.Sleep(50);
 
                        if (serialPort.BytesToRead > 0) goto READAGAIN;//goto标记,数据未接收完继续等待接收完成
 
                        string strInfo = gpsinfo ;
 
                        if (!string.IsNullOrEmpty(strInfo))
                        {
                            DataReceivedQRCode(strInfo);
                        }
                            
                    }
                }
                catch (Exception)
                {
                    //throw new ArgumentException("【ComDevice.ReadPort】" + ex.Message);
                }
            }
        }
 
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <returns></returns>
        public bool Open()
        {
            try
            {
                Close();
                serialPort.Open();
                if (serialPort.IsOpen)
                {
                    StartReading();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                //new AggregateException(ex);
            }
 
            return false;
        }
 
        /// <summary>
        /// 关闭串口
        /// </summary>
        public void Close()
        {
            StopReading();
            serialPort.Close();
        }
 
        /// <summary>
        /// 写数据到卡
        /// </summary>
        /// <param name="send"></param>
        /// <param name="offSet"></param>
        /// <param name="count"></param>
        public void WritePort(byte[] send, int offSet, int count)
        {
            if (IsOpen)
            {
                serialPort.Write(send, offSet, count);
            }
        }
    }

  

这是读取数据的帮助类。类的开头声明了一个委托事件,这个委托就是当二维码扫描头读取到数据触发返回数据的。

然后当使用的时候

public RQCodeComDevice comm1 = new RQCodeComDevice();
 
//二维码驱动方法
comm1.DataReceivedQRCode += new RQCodeComDevice.EventHandleQRCode(getQRCodeValue);
 
        /// <summary>
        /// 读取二维码的数据
        /// </summary>
        /// <param name="text"></param>
        public void getQRCodeValue(string text)
        {
            try
            {
                if (!string.IsNullOrEmpty(text))
                {
                    text = text.Trim();
                    //这里就是读取到的内容,可以进行各种业务处理
                }
            }
            catch (Exception)
            {
            }
        }

  第一步先声明一个对象,然后给委托事件一个方法。就完成了。

posted @ 2019-11-28 15:11  惊风雨  阅读(415)  评论(0)    收藏  举报