欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)

 更新時(shí)間:2025年04月08日 09:31:56   作者:butterfly_onfly  
本文主要介紹了C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

首先,創(chuàng)建一個(gè)掃描槍的工具類(lèi)CommBar

/// <summary>
    /// 掃描槍?zhuān)ù?)工作類(lèi)
    /// </summary>
    public class CommBar : IDisposable
    {
        /// <summary>
        /// 串口引用
        /// </summary>
        public SerialPort serialPort;

        /// <summary>
        /// 存儲(chǔ)轉(zhuǎn)換的數(shù)據(jù)值
        /// </summary>
        public string Code { get; set; }

        /// <summary>
        /// 掃描槍?zhuān)ù?)工作類(lèi)
        /// </summary>
        public CommBar()
        {
            serialPort = new SerialPort();
        }

        /// <summary>
        /// 串口狀態(tài)
        /// </summary>
        public bool IsOpen
        {
            get
            {
                return serialPort.IsOpen;
            }
        }

        /// <summary>
        /// 打開(kāi)串口
        /// </summary>
        /// <returns></returns>
        public bool Open()
        {
            if (serialPort.IsOpen)
            {
                Close();
            }
            serialPort.Open();
            if (serialPort.IsOpen)
            {
                return true;
            }
            else
            {
                MessageBox.Show("串口打開(kāi)失??!");
                return false;
            }
        }

        /// <summary>
        /// 關(guān)閉串口
        /// </summary>
        public void Close()
        {
            serialPort.Close();
        }

        /// <summary>
        /// 寫(xiě)入數(shù)據(jù)
        /// </summary>
        /// <param name="send">數(shù)據(jù)</param>
        /// <param name="offSet">偏移量</param>
        /// <param name="count">字節(jié)數(shù)</param>
        public void WritePort(byte[] send, int offSet, int count)
        {
            if (IsOpen)
            {
                serialPort.Write(send, offSet, count);
            }
        }

        /// <summary>
        /// 獲取可用串口
        /// </summary>
        /// <returns>串口名稱(chēng)列表</returns>
        public string[] GetComName()
        {
            string[] names = null;
            try
            {
                names = SerialPort.GetPortNames(); // 獲取所有可用串口的名字
            }
            catch (Exception)
            {
                System.Windows.Forms.MessageBox.Show("找不到串口");
            }
            return names;
        }

        /// <summary>
        /// 注冊(cè)一個(gè)串口
        /// </summary>
        /// <param name="portName">端口號(hào)</param>
        /// <param name="baudRate">波特率</param>
        public void SerialPortValue(string portName, int baudRate)
        {
            //串口名
            serialPort.PortName = portName;
            //波特率
            serialPort.BaudRate = baudRate;
            //數(shù)據(jù)位
            serialPort.DataBits = 8;
            //兩個(gè)停止位
            serialPort.StopBits = System.IO.Ports.StopBits.One;
            //無(wú)奇偶校驗(yàn)位
            serialPort.Parity = System.IO.Ports.Parity.None;
            serialPort.ReadTimeout = 100;
            //commBar.serialPort.WriteTimeout = -1;
        }

        #region 實(shí)現(xiàn)IDisposable

        private bool m_disposed = false;//標(biāo)識(shí)資源是否被釋放過(guò)

        /// <summary>
        /// 釋放
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);//防止Finalize調(diào)用
        }

        /// <summary>
        /// 釋放
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!m_disposed)
            {
                if (disposing)
                {
                    //釋放托管資源
                    serialPort.Close();
                }
                //釋放非托管資源
                m_disposed = true;
            }
        }

        /// <summary>
        /// 析構(gòu)函數(shù)
        /// </summary>
        ~CommBar()
        {
            Dispose(false);
        }

        #endregion
    }

在窗體里面使用,需要實(shí)例化該類(lèi),建議先在構(gòu)造函數(shù)外面聲明類(lèi)對(duì)象,在構(gòu)造函數(shù)里面實(shí)例化對(duì)象

CommBar commBar;
        public Form2()
        {
          InitializeComponent();
            commBar = new CommBar();
            //注冊(cè)一該串口
            commBar.SerialPortValue("COM1", 9600);
            //打開(kāi)串口
            if (commBar.Open())
                //關(guān)聯(lián)事件處理程序
                commBar.serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
        }

接下來(lái)創(chuàng)建委托和事件

//委托,指向CodeText方法
        private delegate void ModifyButton_dg(CommBar commBar);

        //串口接收接收事件處理程序
        //每當(dāng)串口講到數(shù)據(jù)后激發(fā)
        void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
            byte[] m_recvBytes = new byte[commBar.serialPort.BytesToRead];//定義緩沖區(qū)大小
            int result = commBar.serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//從串口讀取數(shù)據(jù)
            if (result <= 0)
                return;
            commBar.Code = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換
            this.Invoke(new ModifyButton_dg(CodeText), commBar);//調(diào)用委托,將值傳給文本框
            commBar.serialPort.DiscardInBuffer();
        }

給文本框之類(lèi)的容器賦值

//用來(lái)為文本框賦值
        private void CodeText(CommBar commBar)
        {
          //加邏輯判斷等
            this.txt_ASN.Text = commBar.Code;
               
        }

窗體里面需要顯示成功或失敗的文字描述,這里建議這么使用

this.lbl_error.Text = "ASN碼已存在!";
  this.lbl_error.Visible = true;
  System.Threading.Tasks.Task.Delay(3000).ContinueWith(_ =>
   {
      Invoke(new MethodInvoker(() => {
      lbl_error.Visible = false;

       }));
   });

到此這篇關(guān)于C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 串口掃描槍讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論