it编程 > 编程语言 > C#

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

10人参与 2025-04-24 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# 串口扫描枪读取内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

C#实现设置Excel表格中文本对齐方式和格式

04-24

C# 多线程并发编程基础小结

04-24

C# 多项目打包时如何将项目引用转为包依赖(最新推荐)

04-24

C# 配置文件app.config 和 web.config详解

04-24

C#之线程同步Mutex类方式

04-24

C#中高效的多线程并行处理实现方式详解

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论