C# WinForms使用CyUSB.dll访问USB设备的实现步骤

 更新时间:2025年09月01日 08:35:37   作者:leo__520  
CYUSB.dll驱动包为C#开发者提供了便捷的USB设备操作解决方案,该驱动包内含多个版本的cyusb.dll文件,满足不同项目的需求,本文给大家介绍了C# WinForms使用CyUSB.dll访问USB设备的实现步骤,需要的朋友可以参考下

1:环境配置

  1. 安装驱动与 SDK
    • 安装 Cypress EZ-USB FX3 SDK(确保包含 CyUSB.dll)
    • 将 CyUSB.dll 添加到项目引用(路径示例:C:\Program Files\Cypress\Cypress USB\Tools\CyUSB\lib\CyUSB.dll
  2. 创建 WinForms 项目
    • 添加 using CyUSB;命名空间

2:核心代码实现

using System;
using System.Windows.Forms;
using CyUSB;

namespace USB_Communication_Demo
{
    public partial class MainForm : Form
    {
        private CyUSBDeviceList usbDeviceList;  // 设备列表
        private CyUSBDevice connectedDevice;    // 当前设备
        private const int TARGET_VID = 0x0483;  // 目标设备VID(替换为实际值)
        private const int TARGET_PID = 0x5750;  // 目标设备PID(替换为实际值)

        public MainForm()
        {
            InitializeComponent();
            InitializeUSB();
        }

        // 初始化USB设备监控
        private void InitializeUSB()
        {
            usbDeviceList = new CyUSBDeviceList(CyConst.DEVICES_ALL);
            usbDeviceList.DeviceAttached += (s, e) => RefreshDeviceList();  // 设备插入事件
            usbDeviceList.DeviceRemoved += (s, e) => RefreshDeviceList();   // 设备拔出事件
            RefreshDeviceList();  // 初始刷新
        }

        // 刷新设备列表(UI更新)
        private void RefreshDeviceList()
        {
            comboBoxDevices.Invoke((MethodInvoker)delegate {
                comboBoxDevices.Items.Clear();
                foreach (CyUSBDevice dev in usbDeviceList)
                {
                    if (dev.VendorID == TARGET_VID && dev.ProductID == TARGET_PID)
                    {
                        comboBoxDevices.Items.Add($"VID:{dev.VendorID:X4} PID:{dev.ProductID:X4}");
                    }
                }
                if (comboBoxDevices.Items.Count > 0) comboBoxDevices.SelectedIndex = 0;
            });
        }

        // 选择设备并连接
        private void btnConnect_Click(object sender, EventArgs e)
        {
            if (comboBoxDevices.SelectedIndex >= 0)
            {
                connectedDevice = usbDeviceList[comboBoxDevices.SelectedIndex] as CyUSBDevice;
                if (connectedDevice.Open())
                {
                    lblStatus.Text = "设备已连接";
                    btnSend.Enabled = true;
                }
            }
        }

        // 发送数据(OUT端点)
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (connectedDevice == null) return;

            try
            {
                byte[] data = { 0x01, 0x02, 0x03 };  // 示例数据
                int outEndpoint = 0x01;               // OUT端点号(需根据设备手册调整)
                CyUSBEndPoint endpoint = connectedDevice.EndPointOf(outEndpoint);
                endpoint.XferData(data, data.Length);
                lblLog.AppendText("数据发送成功\n");
            }
            catch (Exception ex)
            {
                lblLog.AppendText($"发送失败: {ex.Message}\n");
            }
        }

        // 接收数据(IN端点)
        private void ReceiveData()
        {
            if (connectedDevice == null) return;

            try
            {
                int inEndpoint = 0x81;                // IN端点号(需根据设备手册调整)
                CyUSBEndPoint endpoint = connectedDevice.EndPointOf(inEndpoint);
                byte[] buffer = new byte[64];         // 缓冲区大小需匹配设备配置
                int bytesRead = endpoint.XferData(ref buffer, ref 64);
                if (bytesRead > 0)
                {
                    string hexData = BitConverter.ToString(buffer, 0, bytesRead);
                    lblLog.AppendText($"接收数据: {hexData}\n");
                }
            }
            catch (Exception ex)
            {
                lblLog.AppendText($"接收失败: {ex.Message}\n");
            }
        }

        // 窗体关闭时释放资源
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            connectedDevice?.Close();
            usbDeviceList.Dispose();
            base.OnFormClosing(e);
        }
    }
}

说明

  1. 设备枚举与热插拔
    • 通过 CyUSBDeviceList实时监控 USB 设备插入/拔出事件
    • 使用 Invoke确保 UI 更新在主线程执行(避免跨线程异常)
  2. 数据传输
    • 发送数据:通过 EndPointOf获取 OUT 端点,调用 XferData写入数据
    • 接收数据:通过轮询或事件监听(需扩展)读取 IN 端点数据
  3. 资源管理
    • 使用 Dispose()释放 USB 设备列表资源
    • 关闭设备句柄防止资源泄漏

注意

  1. VID/PID 配置
    • 替换 TARGET_VIDTARGET_PID为实际设备的值(可通过设备管理器查看)
  2. 端点号确认
    • 使用工具(如 Cypress Control Center)或设备手册验证 IN/OUT 端点号
  3. 错误处理扩展
    • 添加重试机制(如发送失败时重试 3 次)
    • 检查设备状态:if (connectedDevice.IsOpen)
  4. 数据格式
    • HID 设备需跳过报告 ID(如 buffer.Skip(1).ToArray()

扩展功能建议

  • 异步接收数据:使用 BeginInvoke实现后台接收
  • 协议解析:根据设备协议解析接收到的二进制数据
  • 日志记录:将通信记录保存到文件

到此这篇关于C# WinForms使用CyUSB.dll访问USB设备的实现步骤的文章就介绍到这了,更多相关C# CyUSB.dll访问USB设备内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# WinForm开发中使用XML配置文件实例

    C# WinForm开发中使用XML配置文件实例

    这篇文章主要介绍了C# WinForm开发中使用XML配置文件实例,本文详细讲解了如何使用一个XML文件作为WinForm的配置文件,需要的朋友可以参考下
    2014-08-08
  • C#数据库操作之LINQ to SQL技术详解

    C#数据库操作之LINQ to SQL技术详解

    本文详细介绍了LINQtoSQL技术,包括其基本概念、使用方法、动态创建数据库、插入数据、查询数据、更新数据和删除数据等操作
    2024-12-12
  • c#装箱和拆箱知识整理

    c#装箱和拆箱知识整理

    这篇文章主要介绍了c#装箱和拆箱知识,装箱和拆箱是一个抽象的概念,需要的朋友可以参考下
    2014-03-03
  • .NET中自定义JSON转换器的实战指南

    .NET中自定义JSON转换器的实战指南

    在.NET开发中,JSON序列化与反序列化是日常开发的核心操作,然而,标准的序列化器(如System.Text.Json)并不能满足所有场景需求,自定义JSON转换器正是解决这些问题的利器,本文将通过基本模式和工厂模式的实战案例,带你掌握自定义转换器的核心技巧,需要的朋友可以参考下
    2025-08-08
  • WinForm中实现数据的异步加载与进度可视化

    WinForm中实现数据的异步加载与进度可视化

    在开发WinForm应用程序时,经常会遇到需要加载大量数据的场景,比如读取文件、查询数据库或调用远程接口,如果这些操作直接在主线程中执行,UI界面就会出现假死现象,所以本文将介绍如何使用.NET提供的BackgroundWorker组件,实现数据的异步加载与进度可视化
    2025-09-09
  • C#语言主要特性总结

    C#语言主要特性总结

    这篇文章主要介绍了C#语言主要特性总结,本文总结了C#语言的简单、现代、面向对象、类型安全、相互兼容性、可伸缩性和可升级性等几个主要特点,需要的朋友可以参考下
    2015-02-02
  • C#制作二维柱状图方法

    C#制作二维柱状图方法

    在本文里小编为各位分享的是关于C#制作二维柱状图方法和步骤,需要的读者们学习下。
    2018-12-12
  • Unity3D选择本地图片并加载

    Unity3D选择本地图片并加载

    这篇文章主要为大家详细介绍了Unity3D选择本地图片并加载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 简单聊聊c# 事件

    简单聊聊c# 事件

    这篇文章主要介绍了c# 事件的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++联合体转换成C#结构的实现方法

    C++联合体转换成C#结构的实现方法

    这篇文章主要介绍了C++联合体转换成C#结构的实现方法,需要的朋友可以参考下
    2014-08-08

最新评论