基于C#实现USB转串口读取扫描枪数据
基于C#实现USB转串口读取扫描枪数据方案,结合串口通信原理与工业级实践:
一、硬件连接与配置
1. 设备连接示意图
扫描枪 → USB转串口模块 → 计算机↑└─ 波特率:9600-115200数据位:8停止位:1校验位:无
2. 驱动安装指南
-
自动安装
插入USB转串口设备 → 系统自动识别 → 设备管理器查看新生成的COM端口(如COM3) -
手动安装(以CH340芯片为例)
1. 下载驱动:https://www.wch.cn/downloads/CH341SER_ZIP.html 2. 设备管理器 → 右键未知设备 → 更新驱动程序 → 选择下载的驱动目录 3. 完成安装后确认COM端口分配
二、核心代码实现
1. 串口通信类(SerialPortHelper.cs)
using System;
using System.IO.Ports;
using System.Threading;public class SerialPortHelper : IDisposable
{private SerialPort _serialPort;private Thread _readThread;private object _lock = new object();private bool _isRunning = false;public event Action<string> DataReceived;public SerialPortHelper(string portName, int baudRate = 9600){_serialPort = new SerialPort(portName, baudRate){Parity = Parity.None,DataBits = 8,StopBits = StopBits.One,Handshake = Handshake.None};}public bool OpenPort(){try{_serialPort.Open();_isRunning = true;_readThread = new Thread(ReadData);_readThread.Start();return true;}catch (Exception ex){Console.WriteLine($"打开串口失败: {ex.Message}");return false;}}private void ReadData(){while (_isRunning){try{if (_serialPort.IsOpen){string data = _serialPort.ReadLine();lock (_lock){DataReceived?.Invoke(data.Trim());}}}catch (TimeoutException) { /* 超时处理 */ }catch (IOException) { /* 断开连接处理 */ }}}public void ClosePort(){_isRunning = false;_serialPort?.Close();}public void Dispose(){ClosePort();_serialPort?.Dispose();}
}
2. 主窗体实现(Form1.cs)
public partial class Form1 : Form
{private SerialPortHelper _serialHelper;private StringBuilder _buffer = new StringBuilder();public Form1(){InitializeComponent();InitializeSerialPort();}private void InitializeSerialPort(){_serialHelper = new SerialPortHelper("COM3", 9600);_serialHelper.DataReceived += OnDataReceived;if (!_serialHelper.OpenPort()){MessageBox.Show("无法打开串口设备");}}private void OnDataReceived(string data){if (InvokeRequired){Invoke(new Action<string>(OnDataReceived), data);return;}// 处理数据格式(示例:去除头尾符号)string processedData = data.TrimStart('<').TrimEnd('>');// 更新UItxtBarcode.AppendText($"[{DateTime.Now:HH:mm:ss}] {processedData}{Environment.NewLine}");txtBarcode.ScrollToCaret();}protected override void OnFormClosing(FormClosingEventArgs e){_serialHelper?.Dispose();base.OnFormClosing(e);}
}
三、关键功能实现
1. 多线程数据处理
// 使用线程池处理耗时操作
private void ProcessBarcode(string code)
{ThreadPool.QueueUserWorkItem(_ => {// 数据库存储SaveToDatabase(code);// 网络传输SendToServer(code);});
}
2. 数据校验与解析
public class BarcodeParser
{public static BarcodeData Parse(string rawData){// 假设数据格式:[类型][长度][数据][校验码]if (rawData.Length < 5) return null;byte type = byte.Parse(rawData.Substring(0, 2), NumberStyles.HexNumber);ushort length = ushort.Parse(rawData.Substring(2, 4), NumberStyles.HexNumber);string data = rawData.Substring(6, length * 2);byte checksum = byte.Parse(rawData.Substring(6 + length * 2, 2), NumberStyles.HexNumber);return new BarcodeData{Type = (BarcodeType)type,Content = data,Checksum = checksum};}
}public enum BarcodeType : byte
{EAN13 = 0x01,QR_CODE = 0x02,CODE128 = 0x03
}
参考代码 usb转串口 读取扫描枪扫描信息 www.youwenfan.com/contentcsf/49494.html
四、异常处理机制
1. 异常捕获策略
public class SerialExceptionHandler
{public static void Handle(Exception ex){if (ex is TimeoutException){// 重试机制RetryConnection();}else if (ex is IOException){// 设备断开处理DeviceReconnected();}else{// 日志记录Logger.LogError(ex);}}
}
2. 自动重连逻辑
private void RetryConnection()
{int retryCount = 0;while (retryCount < 3){try{_serialPort.Close();_serialPort.Open();return;}catch{retryCount++;Thread.Sleep(2000);}}throw new Exception("无法恢复串口连接");
}
五、调试与维护工具
1. 串口调试助手
public class DebugHelper
{public static void CaptureData(string portName){using (var sp = new SerialPort(portName)){sp.Open();File.WriteAllBytes("debug_data.bin", sp.ReadByte());}}
}
2. 数据包分析
public class PacketAnalyzer
{public static void Analyze(byte[] data){if (data[0] == 0x02 && data[1] == 0x10){// 解析EAN13条码var ean = ParseEAN13(data.Skip(2).ToArray());LogEAN(ean);}}
}
六、部署建议
-
权限配置
-
在app.manifest中添加:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
-
-
依赖项管理
<!-- NuGet依赖 --> <PackageReference Include="System.IO.Ports" Version="6.0.0" /> <PackageReference Include="CsvHelper" Version="28.0.0" />
-
安装包制作
- 使用Inno Setup创建安装程序
- 包含.NET Framework 4.8运行时
- 添加USB设备驱动安装步骤
七、扩展功能实现
1. 多设备支持
public class MultiPortManager
{private Dictionary<string, SerialPortHelper> _ports = new();public void AddPort(string portName){if (!_ports.ContainsKey(portName)){var port = new SerialPortHelper(portName);port.DataReceived += OnDataReceived;port.OpenPort();_ports.Add(portName, port);}}
}
2. 数据加密传输
public class SecureSerialPort : SerialPort
{private Aes _aes = Aes.Create();public byte[] EncryptData(byte[] data){using (var encryptor = _aes.CreateEncryptor()){return encryptor.TransformFinalBlock(data, 0, data.Length);}}public byte[] DecryptData(byte[] data){using (var decryptor = _aes.CreateDecryptor()){return decryptor.TransformFinalBlock(data, 0, data.Length);}}
}