核心原理
USB设备通常通过以下方式与计算机通信:
- 虚拟串口(COM端口):如USB转串口设备(CH340/CP2102芯片)
- HID设备:键盘、鼠标等免驱设备
- WinUSB:需自定义驱动的通用USB设备
常用方法及代码示例
▶ 方法1:通过虚拟串口通信(推荐)
适用场景:USB转串口设备(如Arduino、传感器模块)
' 添加引用:项目 → 添加引用 → System.IO.Ports Imports System.IO.Ports Public Sub SendCommandToCOM() Dim serialPort As New SerialPort() ' 配置串口参数 serialPort.PortName = "COM3" ' 设备管理器查看端口号 serialPort.BaudRate = 9600 ' 波特率需匹配设备 serialPort.Parity = Parity.None serialPort.DataBits = 8 serialPort.StopBits = StopBits.One Try serialPort.Open() ' 发送十六进制命令示例:A0 01 FF Dim command As Byte() = {&HA0, &H01, &HFF} serialPort.Write(command, 0, command.Length) ' 接收响应(可选) Dim response As String = serialPort.ReadExisting() MessageBox.Show("响应:" & response) Catch ex As Exception MessageBox.Show("错误:" & ex.Message) Finally If serialPort.IsOpen Then serialPort.Close() End Try End Sub
▶ 方法2:通过HID协议通信
适用场景:符合HID标准的USB设备(需安装HidLibrary
)
' NuGet安装:Install-Package HidLibrary Imports HidLibrary Public Sub SendHIDCommand() ' 查找设备(VID和PID需匹配设备) Dim devices = HidDevices.Enumerate(&H1234, &H5678) If devices.Any() Then Using device = devices.First() device.OpenDevice() ' 构建报告(参考设备文档) Dim report = device.CreateReport() report.Data = {&H0, &HA1, &H2, &HB3} ' 首字节常为Report ID ' 发送数据 Dim success As Boolean = device.WriteReport(report) ' 接收数据(异步示例) AddHandler device.ReadReport, AddressOf OnHidDataReceived End Using Else MessageBox.Show("设备未连接") End If End Sub Private Sub OnHidDataReceived(report As HidReport) Dim data As Byte() = report.Data ' 处理接收到的数据... End Sub
▶ 方法3:使用WinUSB API(高级)
适用场景:需自定义通信的USB设备
' 声明Windows API函数 <DllImport("winusb.dll", SetLastError:=True)> Private Shared Function WinUsb_Initialize(handle As IntPtr, ByRef interfaceHandle As IntPtr) As Boolean End Function ' 完整API封装较复杂,通常需配合SetupDiGetClassDevs等函数 ' 推荐使用第三方库:LibUsbDotNet (NuGet安装)
关键步骤
-
确认设备接口
- 设备管理器 → 查看设备属性 → 详情 → 硬件ID
- 记录VID(供应商ID)和PID(产品ID)
-
获取通信协议
- 查阅设备文档,确定:
- 控制命令格式(如HID报告描述符)
- 数据传输方式(控制传输/中断传输)
- 查阅设备文档,确定:
-
调试工具推荐
- USBlyzer:监控USB数据流
- 串口调试助手:测试虚拟COM口
- HIDAPI Test Tool:验证HID设备
常见问题解决
问题现象 | 解决方案 |
---|---|
设备未识别 | 检查驱动安装,确认VID/PID |
数据发送无响应 | 校验波特率/数据包格式 |
权限拒绝错误 | 以管理员身份运行程序 |
HID通信超时 | 增加device.ReadTimeout 值 |
安全注意事项
- 数据校验:添加CRC校验或校验和确保数据完整性
' CRC16计算示例 Function CalculateCRC(data As Byte()) As UShort Dim crc As UShort = &HFFFF For Each b In data crc = crc Xor b For j As Integer = 0 To 7 crc = If((crc And 1) = 1, (crc >> 1) Xor &HA001, crc >> 1) Next Next Return crc End Function
- 异常处理:所有USB操作必须包裹在
Try-Catch
中 - 资源释放:使用
Using
语句确保端口/设备关闭
最佳实践建议
- 封装通信层:创建独立的
USBComm.vb
类管理连接 - 异步处理:使用
BackgroundWorker
避免UI冻结 - 日志记录:记录所有发送/接收数据以便调试
- 热插拔支持:通过
ManagementEventWatcher
监听设备插拔事件
' 监听USB设备插拔 Imports System.Management Dim watcher As New ManagementEventWatcher("SELECT * FROM Win32_DeviceChangeEvent") AddHandler watcher.EventArrived, AddressOf DeviceChangeHandler watcher.Start()
引用说明:
本文技术方案参考微软官方文档《Windows.Devices.Usb》、HID规范1.11标准、RFC 2217(串口通信标准),第三方库文档详见HidLibrary GitHub和LibUsbDotNet官网。
安全规范依据IEC 62304医疗设备通信标准(Class A级)。
通过以上方法,您可稳定实现VB与USB设备的通信,实际开发中请务必参考具体设备的协议文档,并严格测试异常场景。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/20330.html