串口掃描槍的簡單實現 基於串口通訊的掃描槍的實現,主要藉助SerialPort類,表示串列埠資源。實現很簡單: 工具:usb轉RS232轉接頭/個,掃描槍/套, 掃描槍串口接入轉接頭,轉接頭插電腦 接下來具體代碼實現 1 using System; 2 using System.Collectio ...
串口掃描槍的簡單實現
基於串口通訊的掃描槍的實現,主要藉助SerialPort類,表示串列埠資源。實現很簡單:
工具:usb轉RS232轉接頭/個,掃描槍/套,
掃描槍串口接入轉接頭,轉接頭插電腦
接下來具體代碼實現
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.Net; 11 using System.IO.Ports; 12 using System.Threading; 13 14 namespace SerialScannerDemo 15 { 16 public partial class SerialScanner : Form 17 { 18 public SerialScanner() 19 { 20 InitializeComponent(); 21 } 22 23 private void Form1_Load(object sender, EventArgs e) 24 { 25 InstanceSerialPort(); 26 } 27 28 /// <summary> 29 /// 實例化串列埠資源 30 /// </summary> 31 private void InstanceSerialPort() 32 { 33 //實例化串列埠 34 SerialPort serialPort = new SerialPort(); 35 //埠名 註:因為使用的是USB轉RS232 所以去設備管理器中查看一下虛擬com口的名字 36 serialPort.PortName = "COM5"; 37 //波特率 38 serialPort.BaudRate = 9600; 39 //奇偶校驗 40 serialPort.Parity = Parity.None; 41 //停止位 42 serialPort.StopBits = StopBits.One; 43 //數據位 44 serialPort.DataBits = 8; 45 //忽略null位元組 46 serialPort.DiscardNull = true; 47 //接收事件 48 serialPort.DataReceived += serialPort_DataReceived; 49 //開啟串口 50 serialPort.Open(); 51 } 52 53 /// <summary> 54 /// 接收數據 55 /// </summary> 56 /// <param name="sender"></param> 57 /// <param name="e"></param> 58 void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 59 { 60 try 61 { 62 SerialPort serialPort = (SerialPort)sender; 63 //開啟接收數據線程 64 Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(ReceiveData)); 65 threadReceiveSub.Start(serialPort); 66 } 67 catch (Exception ex) 68 { 69 SetMessage(ex.Message); 70 } 71 } 72 73 private void ReceiveData(object serialPortobj) 74 { 75 try 76 { 77 SerialPort serialPort = (SerialPort)serialPortobj; 78 79 //防止數據接收不完整 線程sleep(100) 80 System.Threading.Thread.Sleep(100); 81 82 string str = serialPort.ReadExisting(); 83 84 if (str == string.Empty) 85 { 86 return; 87 } 88 else 89 { 90 SetMessage(str); 91 } 92 } 93 catch (Exception ex) 94 { 95 SetMessage(ex.Message); 96 } 97 } 98 /// <summary> 99 /// 添加記錄 100 /// </summary> 101 /// <param name="msg"></param> 102 private void SetMessage(string msg) 103 { 104 richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); })); 105 } 106 } 107 }View Code
註:因為使用的是USB轉RS232 所以去設備管理器中查看一下虛擬com口的名字
接下來測試
找一張帶有條碼的包裝袋或者印有條碼的紙掃描
測試完成
這裡說明一下
serialPort中有6個讀的方法
Read();ReadLine(); ReadByte();ReadChar();這幾個讀方法是同步讀
ReadExisting();ReadTo();這兩個方法是非同步讀
代碼中在讀之前使用了Thread.sleep()方法使線程沉睡,目的就是要使非同步讀,讀出的數據完整
順便說一下,基於乙太網的掃描槍的實現,其實將掃描槍當做是一個客戶端,掃描完成一次相當於發送了一次基於TCP或者UDP的請求,使用的socket伺服器略加改變就能實現
c#Socket伺服器與客戶端的開發(1)
源碼:
鏈接:https://pan.baidu.com/s/1mdcj_I8W0RTi-PIs1YBdhA
提取碼:xs8d