使用libUSB-win32的簡單讀寫例程參考

USB上位機程序的編寫,函數的調用過程.

  1. 調用 void usb_init(void); 進行初始化

  2. 調用usb_find_busses、usb_find_devices和usb_get_busses這三個函數,獲得已找到的USB總線序列;然后通過鏈表遍歷所有的USB設備,根據已知的要打開USB設備的ID(VID/PID),找到相應的USB設備.

  3. 調用usb_open函數打開該USB設備

  4. usb_set_configuration(m_dev_handle, 1) ? //設置配置?
  5. intint usb_claim_interface(usb_dev_handle *dev, int interface); ??注冊與操作系統通信的接口,這個函數必須被調用,因為只有注冊接口,才能做相應的操作。
  6. 與USB設備進行通信。使用寫入函數? ?int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);?
  7. int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);//批量讀取? ? ?從USB設備讀取(接收)數據或向其寫入(發送)數據。
  8. int usb_release_interface(usb_dev_handle *dev, int interface);? //注銷被usb_claim_interface函數調用后的接口,釋放資源,和usb_claim_interface對應使用。
  9. ?int usb_close(usb_dev_handle *dev);//與usb_open相對應,關閉設備,是必須調用的, 返回0成功,<0 失敗。
#include <stdio.h> 
#include <string.h> 
#include <iostream>
#include "conio.h"
#include "lusb0_usb.h"
#pragma comment(lib, "libusb.lib")#define m_dev_VID	0x1483        /* Vendor ID of the m_dev         */ 
#define m_dev_PID	0x5751        /* Product ID of the m_dev        */ 
#define EP1_OUT_SIZE	63	      //可根據設備修改大小
#define EP1_IN_SIZE	63int main(int argc, char *argv[]) 
{  struct usb_device * m_dev = NULL; struct usb_dev_handle *m_dev_handle; char str[64];memset(str,0,sizeof(str));usb_init(); usb_find_busses(); usb_find_devices(); struct usb_bus *bus; for(bus = usb_get_busses(); bus; bus = bus->next) { struct usb_device *dev; for(dev = bus->devices; dev; dev = dev->next) { if(dev->descriptor.idVendor == m_dev_VID && dev->descriptor.idProduct == m_dev_PID) m_dev=dev; } } if(!m_dev) { printf("m_dev not found\n"); return 1; } m_dev_handle = usb_open(m_dev); if(!m_dev_handle) { printf("Could not open m_dev\n"); return 1; } printf("設備打開成功!\n"); if(usb_set_configuration(m_dev_handle, 1) < 0) { printf("Could not set configuration\n"); usb_close(m_dev_handle); return 1; } if(usb_claim_interface(m_dev_handle, 0) < 0) //claim_interface 0 注冊與操作系統通信的接口 0{ printf("Could not claim interface\n"); usb_close(m_dev_handle); return 1; } //-----獲取多個端點的地址-----------------------------int num_endpoint = m_dev->config->interface->altsetting->bNumEndpoints;for (int k = 0; k < num_endpoint; k++) {struct usb_endpoint_descriptor endpoint = m_dev->config->interface->altsetting->endpoint[k];int endpoint_address = endpoint.bEndpointAddress;printf("  Endpoint Address: 0x%02x\n", endpoint_address);}//------------------------------------------------------------char WriteTestData[2048] = {0};char ReadTestData[2048] = {0};for(int i = 0; i< 2048; i++){WriteTestData[i] = i;}//端點1寫入數據int ret; ret = usb_bulk_write(m_dev_handle, EP_OUT, WriteTestData, EP1_OUT_SIZE, 500);if(ret != EP1_OUT_SIZE){printf("端點1寫入數據失敗! %d\n", ret);return 1;}else{printf("端點1寫入數據成功!\n");}//端點1讀取數據ret = usb_bulk_read(m_dev_handle, EP_IN, ReadTestData, EP1_IN_SIZE, 500);if(ret != EP1_IN_SIZE){printf("端點1讀取數據失敗! %d\n", ret);return 1;}else{printf("端點1讀取數據成功!\n");for (int i = 0; i < EP1_IN_SIZE; i++){printf("%02X ", ReadTestData[i]);if(((i + 1) % 16) == 0){printf("\n");}}printf("\n");}/**************************************************************************/usb_release_interface(m_dev_handle, 0);		//注銷接口,釋放資源,和usb_claim_interface搭配使用。usb_close(m_dev_handle); printf("\n設備關閉\n"); return 0; 
} 

參考:使用libusb-win32庫, 批量(bulk)傳輸方式, 編寫上位機軟件_編寫上位機通訊軟件實現usb device設備的 批量數據下載及上傳功能-CSDN博客

Qt下libusb-win32的使用(二)批量讀寫操作 - lknlfy - 博客園

上位機程序:libusb,bulk端點傳輸,上位機程序資源-CSDN文庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83395.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue注冊用戶使用v-model實現數據雙向綁定

定義數據模型 Login.vue //定義數據模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 實現數據模型的key與注冊表單中的元素之間的雙向綁定 <!-- 注冊表單 --><el-form ref"form" size"large" autocompl…

【Arthas實戰】常見使用場景與命令分享

簡介: Arthas是一款Java診斷工具&#xff0c;適用于多種場景&#xff0c;如接口響應變慢、CPU占用過高、熱更新需求等。其核心命令包括實時監控面板&#xff08;dashboard&#xff09;、線程狀態查看&#xff08;thread&#xff09;、方法調用鏈路追蹤&#xff08;trace&#x…

Jenkins 最佳實踐

1. 在Jenkins中避免調度過載 過載Jenkins以同時運行多個作業可能導致資源競爭、構建速度變慢和系統性能問題。分配作業啟動時間可以防止瓶頸&#xff0c;并確保更順暢的執行。如何實現&#xff1f; 在Cron表達式中使用H&#xff1a;引入抖動&#xff08;jitter&#xff09;&a…

pytest框架 - 第二集 allure報告

一、斷言assert 二、Pytest 結合 allure-pytest 插件生成美觀的 Allure 報告 (1) 安裝 allure 環境 安裝 allure-pytest 插件&#xff1a;pip install allure-pytest在 github 下載 allure 報告文件 地址&#xff1a;Releases allure-framework/allure2 GitHub下載&#x…

人工智能時代:解鎖職業新身份,從“認證師”到“工程師”的進階之路

在人工智能技術浪潮席卷全球的今天,技術的飛速迭代正在重塑職業版圖。從算法優化到倫理決策,從系統測試到應用開發,AI技術不再只是程序員的專屬領域,而是成為各行各業從業者必須掌握的“生存技能”。當企業爭相布局AI賽道,個人如何在這場變革中搶占先機?答案或許藏在兩個…

【帶文檔】網上點餐系統 springboot + vue 全棧項目實戰(源碼+數據庫+萬字說明文檔)

&#x1f4cc; 一、項目概括 本系統共包含三個角色&#xff1a; 管理員&#xff1a;系統運營管理者 用戶&#xff1a;點餐消費用戶 美食店&#xff1a;上傳菜品與處理訂單的店鋪賬號 通過對這三類角色的權限與業務分工設計&#xff0c;系統實現了點餐流程的全鏈路數字化&a…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驅動目錄下的可以執行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"復制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替換 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

接觸感知 鉗位電路分析

以下是NG板接觸感知電路的原理圖。兩極分別為P3和P4S&#xff0c;電壓值P4S < P3。 電路結構分兩部分&#xff0c;第一部分對輸入電壓進行分壓鉗位。后級電路使用LM113比較器芯片進行電壓比較&#xff0c;輸出ST接觸感知信號。 鉗位電路輸出特性分析 輸出電壓變化趨勢&a…

70、微服務保姆教程(十三)Docker容器詳細講義

一、關于Docker 1.1為什么要用docker? 隨著開發的項目越來越復雜,軟件越來越多,服務器越來越多,我們在開發和部署的時候會遇到很多問題,比如: 1.不同的應用程序可能會有不同的應用環境,比如Java開發的網站和php開發的網站依賴的軟件就不一樣,如果把他們依賴的軟件都…

Python 中的 typing.ClassVar 詳解

一、ClassVar 的定義和基本用途 ClassVar 是 typing 模塊中提供的一種特殊類型&#xff0c;用于在類型注解中標記類變量&#xff08;靜態變量&#xff09;。根據官方文檔&#xff0c;使用 ClassVar[…] 注釋的屬性表示該屬性只在類層面使用&#xff0c;不應在實例上賦值 例如&…

架構與UML4+1視圖

簡單對比分析 架構41視圖 架構41視圖是由Philippe Kruchten提出的&#xff0c;用于描述軟件系統的架構。它包括以下五個視圖&#xff1a; 邏輯視圖&#xff1a;描述系統的功能需求&#xff0c;展示系統的靜態結構&#xff0c;通常使用類圖、對象圖等。開發視圖&#xff1a;…

Redis 八股

目錄 數據類型 字符串&#xff1a; List&#xff1a; HASH&#xff1a; Set&#xff1a; Zset&#xff1a; BitMap&#xff1a;&#xff08;這個及以下是后來新增的數據結構&#xff09; HyperLogLog&#xff1a; GEO&#xff1a; Stream&#xff1a; 主要數據結構 …

基于協同過濾的文學推薦系統設計【源碼+文檔+部署】

基于協同過濾的文學推薦系統設計 摘要 隨著信息技術的飛速發展和文學閱讀需求的日益多樣化&#xff0c;構建一個高效、精準的文學推薦系統變得尤為重要。本文采用Spring Boot框架&#xff0c;結合協同過濾算法&#xff0c;設計并實現了一個基于用戶借閱行為和社交論壇互動的文學…

鴻蒙電腦:五年鑄劍開新篇,國產操作系統新引擎

出品 | 何璽 排版 | 葉媛 前不久&#xff0c;璽哥發布的《鴻蒙電腦&#xff0c;刺向壟斷的利刃&#xff0c;將重塑全球PC市場格局》發布后&#xff0c;獲得了讀者朋友的積極反饋&#xff0c;不少都期望鴻蒙電腦早日發布。 如今&#xff0c;它真來了&#xff01; 5月8日&…

EWOMAIL

1、錯誤 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…

qt5.14.2 opencv調用攝像頭顯示在label

ui界面添加一個Qlabel名字是默認的label 還有一個button名字是pushButton mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <opencv2/opencv.hpp> // 添加OpenCV頭文件 #include <QTimer> // 添加定…

Spring三級緩存的作用與原理詳解

在Spring框架中&#xff0c;Bean的創建過程涉及到了三級緩存機制。這個機制主要是為了提高單例模式下bean實例化和依賴注入的效率。本文將深入探討Spring中的三級緩存&#xff0c;以及其在bean生命周期中的重要作用。 首先&#xff0c;讓我們理解什么是三級緩存。Spring中的三…

IoTDB集群的一鍵啟停功能詳解

IoTDB&#xff08;Internet of Things Database&#xff09;作為一種專為物聯網設計的高性能時序數據庫&#xff0c;支持單機與分布式等多種部署模式。隨著節點數量的增加&#xff0c;手動管理集群的啟動與停止過程變得繁瑣。為了提升部署效率&#xff0c;IoTDB 提供了一鍵啟停…

Oracle學習日記--Oracle中使用單個inert語句實現插入多行記錄

目錄 前言&#xff1a; 問題現象&#xff1a; 問題分析&#xff1a; 解決方法&#xff1a; 1、insert into ... union all句式 2、insert all into ...select 1 from dual句式 總結&#xff1a; 前言&#xff1a; 最近項目中使用到了Oracle數據庫&#xff0c;由于Oracle數…

LabVIEW 程序運行時內存不足報錯原因

在 LabVIEW 程序開發與運行過程中&#xff0c;內存不足報錯并退出是常見且棘手的問題。這不僅影響程序穩定性&#xff0c;還可能導致數據丟失與系統崩潰。以下從程序設計、硬件資源、系統環境等多維度深入剖析其成因&#xff0c;幫助開發者準確定位并解決問題。 ? 一、程序設…