串口掃描槍的簡單實現html
基於串口通信的掃描槍的實現,主要藉助SerialPort類,表示串行端口資源。實現很簡單:c#
工具:usb轉RS232轉接頭/個,掃描槍/套,服務器
掃描槍串口接入轉接頭,轉接頭插電腦異步
接下來具體代碼實現socket
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 }
注:由於使用的是USB轉RS232 因此去設備管理器中查看一下虛擬com口的名字 ide
接下來測試工具
找一張帶有條碼的包裝袋或者印有條碼的紙掃描post
測試完成測試
這裏說明一下url
serialPort中有6個讀的方法
Read();ReadLine(); ReadByte();ReadChar();這幾個讀方法是同步讀
ReadExisting();ReadTo();這兩個方法是異步讀
在測試過程當中發現 執行讀方法後 從緩衝區讀出的數據長度不夠 會拼接到下一次的讀結果中,因此代碼中在讀以前使用了Thread.sleep()方法使線程阻塞,使得從緩衝區讀出的數據完整
順便說一下,基於以太網的掃描槍的實現,其實將掃描槍當作是一個客戶端,掃描完成一次至關於發送了一次基於TCP或者UDP的請求,使用的socket服務器略加改變就能實現
源碼:
連接:https://pan.baidu.com/s/1mdcj_I8W0RTi-PIs1YBdhA 提取碼:xs8d