C#实现USB数据收发

简介: C#实现USB数据收发

一、技术选型对比

库名称 适用场景 优势 局限性
LibUsbDotNet 通用USB设备通信 跨平台支持,API完善 需要安装libusb驱动
HidSharp HID类设备(键盘/鼠标等) 封装简单,支持异步通信 仅限HID协议设备
Windows API 定制化USB开发 直接操作底层接口 代码复杂度高

二、核心实现方案(基于LibUsbDotNet)

1. 设备枚举与连接

using LibUsbDotNet;
using LibUsbDotNet.Main;

public class UsbService {
   
    private UsbDevice _device;
    private UsbEndpointReader _reader;
    private UsbEndpointWriter _writer;

    // 初始化设备
    public bool Connect(int vid, int pid) {
   
        var finder = new UsbDeviceFinder(vid, pid);
        _device = UsbDevice.OpenUsbDevice(finder);

        if (_device == null) return false;

        try {
   
            _device.Open();
            IUsbDevice wholeDevice = _device as IUsbDevice;
            if (wholeDevice != null) {
   
                wholeDevice.SetConfiguration(1);
                wholeDevice.ClaimInterface(0);
            }

            _reader = _device.OpenEndpointReader(ReadEndpointID.Ep01);
            _writer = _device.OpenEndpointWriter(WriteEndpointID.Ep01);
            return true;
        } catch {
   
            _device.Close();
            return false;
        }
    }

    // 断开连接
    public void Disconnect() {
   
        _reader?.Dispose();
        _writer?.Dispose();
        _device?.Close();
        UsbDevice.Exit();
    }
}

2. 数据传输实现

// 同步发送数据
public int SendData(byte[] data) {
   
    int bytesWritten;
    ErrorCode ec = _writer.Write(data, 1000, out bytesWritten);
    return ec == ErrorCode.None ? bytesWritten : -1;
}

// 同步接收数据
public byte[] ReceiveData() {
   
    byte[] buffer = new byte[1024];
    int bytesRead;
    ErrorCode ec = _reader.Read(buffer, 5000, out bytesRead);
    return ec == ErrorCode.None ? buffer.Take(bytesRead).ToArray() : null;
}

// 异步接收(推荐)
public async Task<byte[]> AsyncReceive() {
   
    var buffer = new byte;
    var readTask = _reader.ReadAsync(buffer, 5000);
    await readTask.ConfigureAwait(false);
    return readTask.Result.Length > 0 
        ? readTask.Result.Take(readTask.Result.Length).ToArray() 
        : null;
}

三、高级功能实现

1. 控制传输(配置设备)

public void SendControlCommand(byte requestType, byte request, ushort value, ushort index, byte[] data) {
   
    int transferred;
    _device.ControlTransfer(
        (LibUsbDotNet.Main.ControlTransferFlags)requestType,
        request,
        value,
        index,
        data,
        data.Length,
        out transferred,
        5000);
}

2. 批量传输(高速数据)

// 配置批量端点
public void ConfigureBulkTransfer() {
   
    var deviceDesc = _device.DeviceDescriptor;
    _writer = _device.OpenEndpointWriter(
        ReadEndpointID.Ep02, // 批量输入端点
        512,                 // 最大包尺寸
        EndpointDirection.In);
}

// 执行批量传输
public int BulkWrite(byte[] data) {
   
    int bytesWritten;
    _writer.Write(data, 1000, out bytesWritten);
    return bytesWritten;
}

四、工程实践要点

1. 设备热插拔检测

public static class UsbHotplug {
   
    private static UsbDeviceList _devices = new();

    public static void MonitorChanges(Action<UsbDevice> added, Action<UsbDevice> removed) {
   
        _devices = UsbDevice.AllDevices;
        Timer timer = new Timer(_ => {
   
            var current = UsbDevice.AllDevices;
            var addedDevices = current.Except(_devices).ToList();
            var removedDevices = _devices.Except(current).ToList();

            addedDevices.ForEach(added);
            removedDevices.ForEach(removed);

            _devices = current;
        }, null, 1000, 1000);
    }
}

2. 数据校验机制

// CRC16校验
public ushort CalculateCRC(byte[] data) {
   
    ushort crc = 0xFFFF;
    foreach (byte b in data) {
   
        crc ^= (ushort)(b << 8);
        for (int i = 0; i < 8; i++) {
   
            crc <<= 1;
            if ((crc & 0x10000) != 0) crc ^= 0x1021;
        }
    }
    return crc;
}

// 数据封装
public byte[] CreatePacket(byte[] payload) {
   
    ushort crc = CalculateCRC(payload);
    return new byte[] {
    0xAA, 0x55 } 
        .Concat(payload)
        .Concat(BitConverter.GetBytes(crc))
        .ToArray();
}

五、调试与优化

1. 调试工具推荐

  • USBView:查看设备拓扑和端点信息
  • Wireshark+USBPcap:抓取USB通信数据包
  • Bus Hound:实时监控USB数据流量

2. 性能优化方案

// 双缓冲区技术
private byte[] _bufferA = new byte;
private byte[] _bufferB = new byte;
private bool _useBufferA = true;

// 零拷贝传输
public async Task<int> HighSpeedTransfer(byte[] data) {
   
    var buffer = _useBufferA ? _bufferA : _bufferB;
    Array.Copy(data, buffer, data.Length);
    _useBufferA = !_useBufferA;

    return await _writer.WriteAsync(buffer, 100);
}

参考代码 C# USB 发送和接收数据 www.youwenfan.com/contentalg/92801.html

六、完整项目结构

USBCommunication/
├── Libs/                # 第三方库
│   └── LibUsbDotNet.dll
├── Devices/             # 设备配置
│   └── DeviceConfig.json
├── Src/
│   ├── UsbService.cs    # 核心通信类
│   ├── ProtocolHandler.cs # 协议解析
│   └── HotplugMonitor.cs
└── Tests/               # 单元测试
    └── UsbCommunicationTests.cs

七、常见问题解决方案

  1. 访问被拒绝 以管理员身份运行程序 使用Zadig工具安装WinUSB驱动
  2. 数据丢失 增加数据包序号校验 设置合理的超时时间(建议500-2000ms)
  3. 设备识别失败 检查VID/PID是否正确 使用lsusb(Linux)或USBDeview(Windows)验证设备状态

该方案支持HID设备、CDC类设备等多种USB通信场景,可通过扩展以下功能增强系统:

  • 多设备并发:使用ConcurrentDictionary管理多个连接
  • 固件升级:实现DFU协议支持
  • 加密传输:集成AES-256加密算法
相关文章
|
8天前
|
云安全 监控 安全
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1450 8
|
7天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
479 11
|
19天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1259 43
|
19天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
1167 88
大厂CIO独家分享:AI如何重塑开发者未来十年
|
2天前
|
存储 弹性计算 容灾
阿里云服务器ECS自定义购买流程:超详细新手入门教程
本文详细介绍阿里云服务器ECS自定义购买全流程,涵盖付费模式、地域选择、网络配置、实例规格、镜像系统、存储、公网IP、带宽计费及安全组设置等关键步骤,适合新手入门参考,助你轻松完成云服务器选购与部署。
195 121