USB上位機程序的編寫,函數的調用過程.
-
調用 void usb_init(void); 進行初始化
-
調用usb_find_busses、usb_find_devices和usb_get_busses這三個函數,獲得已找到的USB總線序列;然后通過鏈表遍歷所有的USB設備,根據已知的要打開USB設備的ID(VID/PID),找到相應的USB設備.
-
調用usb_open函數打開該USB設備
- usb_set_configuration(m_dev_handle, 1) ? //設置配置?
- intint usb_claim_interface(usb_dev_handle *dev, int interface); ??注冊與操作系統通信的接口,這個函數必須被調用,因為只有注冊接口,才能做相應的操作。
- 與USB設備進行通信。使用寫入函數? ?int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);?
- int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);//批量讀取? ? ?從USB設備讀取(接收)數據或向其寫入(發送)數據。
- int usb_release_interface(usb_dev_handle *dev, int interface);? //注銷被usb_claim_interface函數調用后的接口,釋放資源,和usb_claim_interface對應使用。
- ?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文庫