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

 更新时间:2025年04月08日 09:31:56   作者: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# 串口扫描枪读取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#如何显式实现接口成员

    c#如何显式实现接口成员

    这篇文章主要介绍了c#如何显式实现接口成员,帮助大家更好的利用c#处理接口,感兴趣的朋友可以了解下
    2020-10-10
  • C#实现动态执行字符串脚本(优化版)的示例代码

    C#实现动态执行字符串脚本(优化版)的示例代码

    这篇文章主要为大家详细介绍了C#如何实现动态执行字符串脚本(优化版),文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • C#实现在两个数字之间生成随机数的方法

    C#实现在两个数字之间生成随机数的方法

    这篇文章主要介绍了C#实现在两个数字之间生成随机数的方法,在一些特殊场景会用到哦,需要的朋友可以参考下
    2014-08-08
  • 使用@符号让C#中的保留字做变量名的方法详解

    使用@符号让C#中的保留字做变量名的方法详解

    本篇文章是对使用@符号让C#中的保留字做变量名的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • WinForm 自动完成控件实例代码简析

    WinForm 自动完成控件实例代码简析

    在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了,接下来参考一下这个实例,看看有没有以外收获,感兴趣的朋友可以了解下啊,希望本文对你有帮助啊
    2013-01-01
  • C#获取本地IP的四种方式示例详解

    C#获取本地IP的四种方式示例详解

    这篇文章主要介绍了C#获取本地IP的四种方式示例详解, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C#泛型和反射实例解析

    C#泛型和反射实例解析

    这篇文章主要介绍了C#泛型和反射实例解析,对于C#初学者理解泛型和反射有很好的帮助借鉴作用,需要的朋友可以参考下
    2014-08-08
  • c# webapi 配置swagger的方法

    c# webapi 配置swagger的方法

    这篇文章主要介绍了c# webapi 配置swagger的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 基于C#实现俄罗斯方块游戏

    基于C#实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了基于C#实现俄罗斯方块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#子线程更新UI控件的方法实例总结

    C#子线程更新UI控件的方法实例总结

    这篇文章主要介绍了C#子线程更新UI控件的方法,在桌面应用程序中控制UI界面有着不错的实用价值,需要的朋友可以参考下
    2014-09-09

最新评论