当前位置:首页 > 电脑教程 > 正文

VB如何向USB发送命令

在VB中通过调用Windows API函数(如CreateFile、WriteFile)向USB设备发送命令,需先打开设备句柄,然后写入数据,设备需支持HID或虚拟串口等协议才能实现通信。

核心原理

USB设备通常通过以下方式与计算机通信:

  1. 虚拟串口(COM端口):如USB转串口设备(CH340/CP2102芯片)
  2. HID设备:键盘、鼠标等免驱设备
  3. 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

VB如何向USB发送命令  第1张

' 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安装)

关键步骤

  1. 确认设备接口

    • 设备管理器 → 查看设备属性 → 详情 → 硬件ID
    • 记录VID(供应商ID)和PID(产品ID)
  2. 获取通信协议

    • 查阅设备文档,确定:
      • 控制命令格式(如HID报告描述符)
      • 数据传输方式(控制传输/中断传输)
  3. 调试工具推荐

    • USBlyzer:监控USB数据流
    • 串口调试助手:测试虚拟COM口
    • HIDAPI Test Tool:验证HID设备

常见问题解决

问题现象 解决方案
设备未识别 检查驱动安装,确认VID/PID
数据发送无响应 校验波特率/数据包格式
权限拒绝错误 以管理员身份运行程序
HID通信超时 增加device.ReadTimeout

安全注意事项

  1. 数据校验:添加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
  2. 异常处理:所有USB操作必须包裹在Try-Catch
  3. 资源释放:使用Using语句确保端口/设备关闭

最佳实践建议

  1. 封装通信层:创建独立的USBComm.vb类管理连接
  2. 异步处理:使用BackgroundWorker避免UI冻结
  3. 日志记录:记录所有发送/接收数据以便调试
  4. 热插拔支持:通过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设备的通信,实际开发中请务必参考具体设备的协议文档,并严格测试异常场景。

0