C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)
首先,創(chuàng)建一個(gè)掃描槍的工具類CommBar
/// <summary>
/// 掃描槍(串口 )工作類
/// </summary>
public class CommBar : IDisposable
{
/// <summary>
/// 串口引用
/// </summary>
public SerialPort serialPort;
/// <summary>
/// 存儲轉(zhuǎn)換的數(shù)據(jù)值
/// </summary>
public string Code { get; set; }
/// <summary>
/// 掃描槍(串口 )工作類
/// </summary>
public CommBar()
{
serialPort = new SerialPort();
}
/// <summary>
/// 串口狀態(tài)
/// </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>
/// 關(guān)閉串口
/// </summary>
public void Close()
{
serialPort.Close();
}
/// <summary>
/// 寫入數(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>串口名稱列表</returns>
public string[] GetComName()
{
string[] names = null;
try
{
names = SerialPort.GetPortNames(); // 獲取所有可用串口的名字
}
catch (Exception)
{
System.Windows.Forms.MessageBox.Show("找不到串口");
}
return names;
}
/// <summary>
/// 注冊一個(gè)串口
/// </summary>
/// <param name="portName">端口號</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;
//無奇偶校驗(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)識資源是否被釋放過
/// <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í)例化該類,建議先在構(gòu)造函數(shù)外面聲明類對象,在構(gòu)造函數(shù)里面實(shí)例化對象
CommBar commBar;
public Form2()
{
InitializeComponent();
commBar = new CommBar();
//注冊一該串口
commBar.SerialPortValue("COM1", 9600);
//打開串口
if (commBar.Open())
//關(guān)聯(lián)事件處理程序
commBar.serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
}接下來創(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);//對數(shù)據(jù)進(jìn)行轉(zhuǎn)換
this.Invoke(new ModifyButton_dg(CodeText), commBar);//調(diào)用委托,將值傳給文本框
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;
}));
});到此這篇關(guān)于C# 串口掃描槍讀取數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 串口掃描槍讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)動態(tài)執(zhí)行字符串腳本(優(yōu)化版)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)動態(tài)執(zhí)行字符串腳本(優(yōu)化版),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
C#實(shí)現(xiàn)在兩個(gè)數(shù)字之間生成隨機(jī)數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在兩個(gè)數(shù)字之間生成隨機(jī)數(shù)的方法,在一些特殊場景會用到哦,需要的朋友可以參考下2014-08-08

