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)
            {
            }
        }

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

以下是使用WinForms读取USB串口数据的基本步骤: 1. 添加System.IO.Ports命名空间,该命名空间包含了与串口相关的类和方法。 2. 在WinForms中添加一个SerialPort控件。 3. 设置SerialPort控件的属性,包括端口号、波特率、数据位、停止位等。 4. 在代码中打开串口,并添加DataReceived事件处理程序。 5. 在DataReceived事件中读取串口数据,并将其显示在WinForms上。 以下是一个简单的示例代码,可以帮助你开始: ```csharp using System; using System.IO.Ports; using System.Windows.Forms; namespace SerialPortReader { public partial class Form1 : Form { private SerialPort _serialPort; public Form1() { InitializeComponent(); _serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); } private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string data = sp.ReadExisting(); Invoke(new Action(() => textBox1.AppendText(data))); } private void button1_Click(object sender, EventArgs e) { _serialPort.Open(); } private void button2_Click(object sender, EventArgs e) { _serialPort.Close(); } } } ``` 在上面的代码中,我们创建了一个名为_serialPort的SerialPort对象,并设置它的属性。在构造函数中,我们还为DataReceived事件添加了一个处理程序。在事件处理程序中,我们读取串口数据并将其添加到textBox1控件中,因为WinForms控件只能从UI线程更新,所以我们使用了Invoke方法来确保代码在UI线程上运行。 最后,我们在button1_Click事件中打开串口,并在button2_Click事件中关闭串口。 注意:在运行代码之前,请确保将“COM1”替换为实际的串口号,并确保串口已连接到计算机。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值