C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)
首先,創(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)文章
C#實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行字符串腳本(優(yōu)化版)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行字符串腳本(優(yōu)化版),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03C#實(shí)現(xiàn)在兩個(gè)數(shù)字之間生成隨機(jī)數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在兩個(gè)數(shù)字之間生成隨機(jī)數(shù)的方法,在一些特殊場(chǎng)景會(huì)用到哦,需要的朋友可以參考下2014-08-08WinForm 自動(dòng)完成控件實(shí)例代碼簡(jiǎn)析
在Web的應(yīng)用方面有js的插件實(shí)現(xiàn)自動(dòng)完成(或叫智能提示)功能,但在WinForm窗體應(yīng)用方面就沒(méi)那么好了,接下來(lái)參考一下這個(gè)實(shí)例,看看有沒(méi)有以外收獲,感興趣的朋友可以了解下啊,希望本文對(duì)你有幫助啊2013-01-01C#子線(xiàn)程更新UI控件的方法實(shí)例總結(jié)
這篇文章主要介紹了C#子線(xiàn)程更新UI控件的方法,在桌面應(yīng)用程序中控制UI界面有著不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09