最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# WinForms使用CyUSB.dll訪問USB設備的實現(xiàn)步驟

 更新時間:2025年09月01日 08:35:37   作者:leo__520  
CYUSB.dll驅(qū)動包為C#開發(fā)者提供了便捷的USB設備操作解決方案,該驅(qū)動包內(nèi)含多個版本的cyusb.dll文件,滿足不同項目的需求,本文給大家介紹了C# WinForms使用CyUSB.dll訪問USB設備的實現(xiàn)步驟,需要的朋友可以參考下

1:環(huán)境配置

  1. 安裝驅(qū)動與 SDK
    • 安裝 Cypress EZ-USB FX3 SDK(確保包含 CyUSB.dll)
    • 將 CyUSB.dll 添加到項目引用(路徑示例:C:\Program Files\Cypress\Cypress USB\Tools\CyUSB\lib\CyUSB.dll
  2. 創(chuàng)建 WinForms 項目
    • 添加 using CyUSB;命名空間

2:核心代碼實現(xiàn)

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設備監(jiān)控
        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;
                }
            }
        }

        // 發(fā)送數(shù)據(jù)(OUT端點)
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (connectedDevice == null) return;

            try
            {
                byte[] data = { 0x01, 0x02, 0x03 };  // 示例數(shù)據(jù)
                int outEndpoint = 0x01;               // OUT端點號(需根據(jù)設備手冊調(diào)整)
                CyUSBEndPoint endpoint = connectedDevice.EndPointOf(outEndpoint);
                endpoint.XferData(data, data.Length);
                lblLog.AppendText("數(shù)據(jù)發(fā)送成功\n");
            }
            catch (Exception ex)
            {
                lblLog.AppendText($"發(fā)送失敗: {ex.Message}\n");
            }
        }

        // 接收數(shù)據(jù)(IN端點)
        private void ReceiveData()
        {
            if (connectedDevice == null) return;

            try
            {
                int inEndpoint = 0x81;                // IN端點號(需根據(jù)設備手冊調(diào)整)
                CyUSBEndPoint endpoint = connectedDevice.EndPointOf(inEndpoint);
                byte[] buffer = new byte[64];         // 緩沖區(qū)大小需匹配設備配置
                int bytesRead = endpoint.XferData(ref buffer, ref 64);
                if (bytesRead > 0)
                {
                    string hexData = BitConverter.ToString(buffer, 0, bytesRead);
                    lblLog.AppendText($"接收數(shù)據(jù): {hexData}\n");
                }
            }
            catch (Exception ex)
            {
                lblLog.AppendText($"接收失敗: {ex.Message}\n");
            }
        }

        // 窗體關(guān)閉時釋放資源
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            connectedDevice?.Close();
            usbDeviceList.Dispose();
            base.OnFormClosing(e);
        }
    }
}

說明

  1. 設備枚舉與熱插拔
    • 通過 CyUSBDeviceList實時監(jiān)控 USB 設備插入/拔出事件
    • 使用 Invoke確保 UI 更新在主線程執(zhí)行(避免跨線程異常)
  2. 數(shù)據(jù)傳輸
    • 發(fā)送數(shù)據(jù):通過 EndPointOf獲取 OUT 端點,調(diào)用 XferData寫入數(shù)據(jù)
    • 接收數(shù)據(jù):通過輪詢或事件監(jiān)聽(需擴展)讀取 IN 端點數(shù)據(jù)
  3. 資源管理
    • 使用 Dispose()釋放 USB 設備列表資源
    • 關(guān)閉設備句柄防止資源泄漏

注意

  1. VID/PID 配置
    • 替換 TARGET_VIDTARGET_PID為實際設備的值(可通過設備管理器查看)
  2. 端點號確認
    • 使用工具(如 Cypress Control Center)或設備手冊驗證 IN/OUT 端點號
  3. 錯誤處理擴展
    • 添加重試機制(如發(fā)送失敗時重試 3 次)
    • 檢查設備狀態(tài):if (connectedDevice.IsOpen)
  4. 數(shù)據(jù)格式
    • HID 設備需跳過報告 ID(如 buffer.Skip(1).ToArray()

擴展功能建議

  • 異步接收數(shù)據(jù):使用 BeginInvoke實現(xiàn)后臺接收
  • 協(xié)議解析:根據(jù)設備協(xié)議解析接收到的二進制數(shù)據(jù)
  • 日志記錄:將通信記錄保存到文件

到此這篇關(guān)于C# WinForms使用CyUSB.dll訪問USB設備的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)C# CyUSB.dll訪問USB設備內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#代碼實現(xiàn)替換PDF文檔中的文本

    C#代碼實現(xiàn)替換PDF文檔中的文本

    人們經(jīng)常需要替換 PDF 文檔中的文本,本文將介紹如何使用 C# 替換 PDF 文檔中的文本,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-05-05
  • C#調(diào)用外部程序的三種實現(xiàn)方式的示例

    C#調(diào)用外部程序的三種實現(xiàn)方式的示例

    在C#中調(diào)用外部程序通常有幾種方式,本文將介紹其中的三種主要方法:System.Diagnostics.Process?類、System.Shell類以及使用C#的System.Diagnostics.ProcessStartInfo類與System.Diagnostics.Process?類結(jié)合,感興趣的可以了解一下
    2025-05-05
  • 基于C#實現(xiàn)ModbusTCP服務器接口的方法

    基于C#實現(xiàn)ModbusTCP服務器接口的方法

    ModbusTCP服務器的本質(zhì)就是TCP服務器,根據(jù)識別ModbusTCP請求報文,返回對應的ModbusTCP報文,今天給大家分享一下,如何基于C#來ModbusTCP服務器接口,需要的朋友可以參考下
    2025-01-01
  • 利用C#實現(xiàn)可以繼承的"枚舉"

    利用C#實現(xiàn)可以繼承的"枚舉"

    工作中許多代碼中用到枚舉(enum),更用到了需要繼承的枚舉,由于C#的枚舉不允許被繼承,所以本文就來模擬實現(xiàn)一個可以繼承的仿枚舉吧
    2023-05-05
  • C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法,需要的朋友可以參考一下
    2013-04-04
  • c#中將uint值轉(zhuǎn)換成int的實例方法

    c#中將uint值轉(zhuǎn)換成int的實例方法

    在本文里小編給大家整理的是關(guān)于c#中將uint值轉(zhuǎn)換成int的實例方法,需要的朋友們學習參考下。
    2019-08-08
  • C#操作ini文件的幫助類

    C#操作ini文件的幫助類

    這篇文章介紹了C#操作ini文件的幫助類,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#實現(xiàn)計算器精簡版

    C#實現(xiàn)計算器精簡版

    這篇文章主要為大家詳細介紹了C#實現(xiàn)計算器精簡版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用策略模式實現(xiàn)報警服務示例詳解(短信報警)

    使用策略模式實現(xiàn)報警服務示例詳解(短信報警)

    服務的功能:這個服務就是能夠?qū)崿F(xiàn)多通路報警的服務,比如郵件報警、客戶端報警、短信報警等,該服務靈活性還不錯,比較方便擴展
    2014-01-01
  • Visual C#中如何使用IComparable和IComparer接口

    Visual C#中如何使用IComparable和IComparer接口

    這篇文章主要介紹了C#中使用IComparable和IComparer接口,在本例中,該對象被用作第二個參數(shù)被傳遞給Array.Sort的接受IComparer實例的重載方法,需要的朋友可以參考下
    2023-04-04

最新評論

阳泉市| 志丹县| 龙井市| 鹿泉市| 徐州市| 蚌埠市| 黄平县| 吴川市| 冕宁县| 长顺县| 洛阳市| 广德县| 莆田市| 西峡县| 蚌埠市| 凤山市| 同德县| 平罗县| 惠来县| 青浦区| 玛曲县| 榕江县| 抚松县| 曲水县| 信阳市| 玉屏| 那坡县| 崇明县| 甘德县| 泰来县| 旬阳县| 巴东县| 伽师县| 闸北区| 深圳市| 精河县| 东海县| 京山县| 米林县| 洪泽县| 深圳市|