C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 串口扫描枪读取

C# 串口扫描枪读取数据的实现

作者:butterfly_onfly

本文主要介绍了C# 串口扫描枪读取数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

首先,创建一个扫描枪的工具类CommBar

/// <summary>
    /// 扫描枪(串口 )工作类
    /// </summary>
    public class CommBar : IDisposable
    {
        /// <summary>
        /// 串口引用
        /// </summary>
        public SerialPort serialPort;

        /// <summary>
        /// 存储转换的数据值
        /// </summary>
        public string Code { get; set; }

        /// <summary>
        /// 扫描枪(串口 )工作类
        /// </summary>
        public CommBar()
        {
            serialPort = new SerialPort();
        }

        /// <summary>
        /// 串口状态
        /// </summary>
        public bool IsOpen
        {
            get
            {
                return serialPort.IsOpen;
            }
        }

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

        /// <summary>
        /// 关闭串口
        /// </summary>
        public void Close()
        {
            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);
            }
        }

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

        /// <summary>
        /// 注册一个串口
        /// </summary>
        /// <param name="portName">端口号</param>
        /// <param name="baudRate">波特率</param>
        public void SerialPortValue(string portName, int baudRate)
        {
            //串口名
            serialPort.PortName = portName;
            //波特率
            serialPort.BaudRate = baudRate;
            //数据位
            serialPort.DataBits = 8;
            //两个停止位
            serialPort.StopBits = System.IO.Ports.StopBits.One;
            //无奇偶校验位
            serialPort.Parity = System.IO.Ports.Parity.None;
            serialPort.ReadTimeout = 100;
            //commBar.serialPort.WriteTimeout = -1;
        }

        #region 实现IDisposable

        private bool m_disposed = false;//标识资源是否被释放过

        /// <summary>
        /// 释放
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);//防止Finalize调用
        }

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

        /// <summary>
        /// 析构函数
        /// </summary>
        ~CommBar()
        {
            Dispose(false);
        }

        #endregion
    }

在窗体里面使用,需要实例化该类,建议先在构造函数外面声明类对象,在构造函数里面实例化对象

CommBar commBar;
        public Form2()
        {
          InitializeComponent();
            commBar = new CommBar();
            //注册一该串口
            commBar.SerialPortValue("COM1", 9600);
            //打开串口
            if (commBar.Open())
                //关联事件处理程序
                commBar.serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
        }

接下来创建委托和事件

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

        //串口接收接收事件处理程序
        //每当串口讲到数据后激发
        void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
            byte[] m_recvBytes = new byte[commBar.serialPort.BytesToRead];//定义缓冲区大小
            int result = commBar.serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//从串口读取数据
            if (result <= 0)
                return;
            commBar.Code = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//对数据进行转换
            this.Invoke(new ModifyButton_dg(CodeText), commBar);//调用委托,将值传给文本框
            commBar.serialPort.DiscardInBuffer();
        }

给文本框之类的容器赋值

//用来为文本框赋值
        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;

       }));
   });

到此这篇关于C# 串口扫描枪读取数据的实现的文章就介绍到这了,更多相关C# 串口扫描枪读取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文