注:只要掃碼槍設備都連接成功這段代碼才可以使用
如果不使用SerialPort控件可以這樣寫 最后獲取掃碼的結果放在textbox控件上有掃碼槍的可以試一下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace 串口Dome { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //聲明一個串口 public static SerialPort _serialPort; public void setPort(string portName, int baudRate) { //實例化一下串口 _serialPort = new SerialPort(); this.RegisterSerialPort(portName, baudRate); if (_serialPort.IsOpen == false) { _serialPort.Open(); }
//不用太關注這個我也不是很懂,只要知道他是個回調函數就可以 _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); } /// <summary> /// 注冊串口 /// </summary> /// <param name="portName"></param> /// <param name="baudRate"></param> public void RegisterSerialPort(string portName, int baudRate) { // 串口名 _serialPort.PortName = portName; // 波特率 _serialPort.BaudRate = baudRate; // 數據位 _serialPort.DataBits = 8; // 停止位 _serialPort.StopBits = StopBits.One; // 無奇偶校驗位 _serialPort.Parity = Parity.None; } private void _serialPort_DataReceived(object senderd, SerialDataReceivedEventArgs e) { //等待100ms 防止讀取不全的情況 Thread.Sleep(100); byte[] m_recvBytes = new byte[_serialPort.BytesToRead]; //獲取接受緩沖區的字節數 定義緩沖區的大小 int result = _serialPort.Read(m_recvBytes, 0, m_recvBytes.Length);//從串口讀取數據 返回讀取的字節數 if (result <= 0) { return; } //將字節轉換成字符串 //string strResult = Encoding.ASCII.GetString(m_recvBytes); string strResult = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length); //string strResult = Encoding.UTF8..GetString(); _serialPort.DiscardInBuffer(); this.Invoke((EventHandler)(delegate { txtCK.Text = strResult; })); } private void Form1_Load(object sender, EventArgs e) {
//參數1:串口(端口)號名稱 參數2:波特率 setPort("COM14", 9600); } } }
下面這個是使用SerialPort控件寫的 省略了注冊串口的那個方法
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace 串口Dome { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public static SerialPort serialPort = new SerialPort(); public void setPort() { if (serialPort.IsOpen==false) { serialPort.Open(); } serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); } private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { //防止讀取不全的情況 等待100ms Thread.Sleep(100); byte[] m_recvBytes = new byte[serialPort.BytesToRead];//獲取緩沖區的的字節數 int reslut = serialPort.Read(m_recvBytes, 0, m_recvBytes.Length); if (reslut <= 0) { return; } string strResult = Encoding.ASCII.GetString(m_recvBytes, 0, m_recvBytes.Length);//轉換成字符串格式的 serialPort.DiscardInBuffer(); this.Invoke((EventHandler)(delegate { TxtCode.Text = strResult; })); } private void Form2_Load(object sender, EventArgs e) { var str = BarCode.PortName; int num = BarCode.BaudRate;
setPort() MessageBox.Show("Name:" + str + " " + "波特率" + num); } } }
后期有更好的理解和寫法在補充上去
增加一個使用正則表達來轉換條碼 代碼量少
同第二個方法一樣 使用SerialPort控件 在控件屬性中修改對應的COM名稱和波特率
接下來就是代碼部分
public void OpenSbar() { if (serialPort1.IsOpen == false) { serialPort1.Open(); } serialPort1.DataReceived += new SerialDataReceivedEventHandler(SBar_DataReceived); } private void SBar_DataReceived(object sender, SerialDataReceivedEventArgs e) { this.labelCode.Text = "等待中..."; Thread.Sleep(150); string str_Buff = serialPort1.ReadExisting(); str_Buff = System.Text.RegularExpressions.Regex.Replace(str_Buff, @"[^0-9a-zA-Z]+", ""); //Code獲取到的條碼 string Code = str_Buff.Trim(); }