C#串口掃描槍的簡單實現 c#Socket服務器與客戶端的開發(1)

串口掃描槍的簡單實現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 }
View Code

 

注:由於使用的是USB轉RS232 因此去設備管理器中查看一下虛擬com口的名字 ide

接下來測試工具

找一張帶有條碼的包裝袋或者印有條碼的紙掃描post

測試完成測試

 

這裏說明一下url

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

相關文章
相關標籤/搜索