设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 我首页的歌单评论里是吴亦凡与梅格妮的二三事 一个又一个真实暖心的故事 是属于吴亦凡和粉丝之间的二三

我首页的歌单评论里是吴亦凡与梅格妮的二三事 一个又一个真实暖心的故事 是属于吴亦凡和粉丝之间的二三 -- 贰叁

查看: 782|回复: 0

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:16
  • 打卡月天数:0
  • 打卡总奖励:252
  • 最近打卡:2023-12-29 08:30:22
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
39
主题
33
精华
0
金钱
373
积分
84
注册时间
2023-8-12
最后登录
2025-6-1

发表于 2025-6-1 05:35:59 | 显示全部楼层 |阅读模式
首先,创建一个扫描枪的工具类CommBar
  1. /// <summary>
  2.     /// 扫描枪(串口 )工作类
  3.     /// </summary>
  4.     public class CommBar : IDisposable
  5.     {
  6.         /// <summary>
  7.         /// 串口引用
  8.         /// </summary>
  9.         public SerialPort serialPort;

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

  14.         /// <summary>
  15.         /// 扫描枪(串口 )工作类
  16.         /// </summary>
  17.         public CommBar()
  18.         {
  19.             serialPort = new SerialPort();
  20.         }

  21.         /// <summary>
  22.         /// 串口状态
  23.         /// </summary>
  24.         public bool IsOpen
  25.         {
  26.             get
  27.             {
  28.                 return serialPort.IsOpen;
  29.             }
  30.         }

  31.         /// <summary>
  32.         /// 打开串口
  33.         /// </summary>
  34.         /// <returns></returns>
  35.         public bool Open()
  36.         {
  37.             if (serialPort.IsOpen)
  38.             {
  39.                 Close();
  40.             }
  41.             serialPort.Open();
  42.             if (serialPort.IsOpen)
  43.             {
  44.                 return true;
  45.             }
  46.             else
  47.             {
  48.                 MessageBox.Show("串口打开失败!");
  49.                 return false;
  50.             }
  51.         }

  52.         /// <summary>
  53.         /// 关闭串口
  54.         /// </summary>
  55.         public void Close()
  56.         {
  57.             serialPort.Close();
  58.         }

  59.         /// <summary>
  60.         /// 写入数据
  61.         /// </summary>
  62.         /// <param name="send">数据</param>
  63.         /// <param name="offSet">偏移量</param>
  64.         /// <param name="count">字节数</param>
  65.         public void WritePort(byte[] send, int offSet, int count)
  66.         {
  67.             if (IsOpen)
  68.             {
  69.                 serialPort.Write(send, offSet, count);
  70.             }
  71.         }

  72.         /// <summary>
  73.         /// 获取可用串口
  74.         /// </summary>
  75.         /// <returns>串口名称列表</returns>
  76.         public string[] GetComName()
  77.         {
  78.             string[] names = null;
  79.             try
  80.             {
  81.                 names = SerialPort.GetPortNames(); // 获取所有可用串口的名字
  82.             }
  83.             catch (Exception)
  84.             {
  85.                 System.Windows.Forms.MessageBox.Show("找不到串口");
  86.             }
  87.             return names;
  88.         }

  89.         /// <summary>
  90.         /// 注册一个串口
  91.         /// </summary>
  92.         /// <param name="portName">端口号</param>
  93.         /// <param name="baudRate">波特率</param>
  94.         public void SerialPortValue(string portName, int baudRate)
  95.         {
  96.             //串口名
  97.             serialPort.PortName = portName;
  98.             //波特率
  99.             serialPort.BaudRate = baudRate;
  100.             //数据位
  101.             serialPort.DataBits = 8;
  102.             //两个停止位
  103.             serialPort.StopBits = System.IO.Ports.StopBits.One;
  104.             //无奇偶校验位
  105.             serialPort.Parity = System.IO.Ports.Parity.None;
  106.             serialPort.ReadTimeout = 100;
  107.             //commBar.serialPort.WriteTimeout = -1;
  108.         }

  109.         #region 实现IDisposable

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

  111.         /// <summary>
  112.         /// 释放
  113.         /// </summary>
  114.         public void Dispose()
  115.         {
  116.             Dispose(true);
  117.             GC.SuppressFinalize(this);//防止Finalize调用
  118.         }

  119.         /// <summary>
  120.         /// 释放
  121.         /// </summary>
  122.         /// <param name="disposing"></param>
  123.         protected virtual void Dispose(bool disposing)
  124.         {
  125.             if (!m_disposed)
  126.             {
  127.                 if (disposing)
  128.                 {
  129.                     //释放托管资源
  130.                     serialPort.Close();
  131.                 }
  132.                 //释放非托管资源
  133.                 m_disposed = true;
  134.             }
  135.         }

  136.         /// <summary>
  137.         /// 析构函数
  138.         /// </summary>
  139.         ~CommBar()
  140.         {
  141.             Dispose(false);
  142.         }

  143.         #endregion
  144.     }
复制代码
在窗体里面使用,需要实例化该类,建议先在构造函数外面声明类对象,在构造函数里面实例化对象
  1. CommBar commBar;
  2.         public Form2()
  3.         {
  4.           InitializeComponent();
  5.             commBar = new CommBar();
  6.             //注册一该串口
  7.             commBar.SerialPortValue("COM1", 9600);
  8.             //打开串口
  9.             if (commBar.Open())
  10.                 //关联事件处理程序
  11.                 commBar.serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
  12.         }
复制代码
接下来创建委托和事件
  1. //委托,指向CodeText方法
  2.         private delegate void ModifyButton_dg(CommBar commBar);

  3.         //串口接收接收事件处理程序
  4.         //每当串口讲到数据后激发
  5.         void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  6.         {
  7.             System.Threading.Thread.Sleep(100);
  8.             byte[] m_recvBytes = new byte[commBar.serialPort.BytesToRead];//定义缓冲区大小
  9.             int result = commBar.serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//从串口读取数据
  10.             if (result <= 0)
  11.                 return;
  12.             commBar.Code = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//对数据进行转换
  13.             this.Invoke(new ModifyButton_dg(CodeText), commBar);//调用委托,将值传给文本框
  14.             commBar.serialPort.DiscardInBuffer();
  15.         }
复制代码
给文本框之类的容器赋值
  1. //用来为文本框赋值
  2.         private void CodeText(CommBar commBar)
  3.         {
  4.           //加逻辑判断等
  5.             this.txt_ASN.Text = commBar.Code;
  6.                
  7.         }
复制代码
窗体里面需要显示成功或失败的文字描述,这里建议这么使用
  1. this.lbl_error.Text = "ASN码已存在!";
  2.   this.lbl_error.Visible = true;
  3.   System.Threading.Tasks.Task.Delay(3000).ContinueWith(_ =>
  4.    {
  5.       Invoke(new MethodInvoker(() => {
  6.       lbl_error.Visible = false;

  7.        }));
  8.    });
复制代码
到此这篇关于C# 串口扫描枪读取数据的实现的文章就介绍到这了,更多相关C# 串口扫描枪读取内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表