libusb-1.0.22 示例

linux libusb使用libusb_claim_interface失败(-6,Resource busy)解决方案 在知乎上发现了一篇博客,给了我很大的启发,也是resource的最终解决方案。 这里查看内核程序是否激活的函数是libusb_kernel_driver_active,放在代码中如下所示 //check kernel active if (libusb_kernel_driver_active(dev_handle, 0) == 1) //!!!@@@@@@!!! Interface Number { printf("USB Kernel Driver Ac... 阅读详情

环境配置:

  win7-x86

  Qt5.9.7 + mingw-win32

SRC: 

g_header.h

#ifndef __USB_GLOBAL_H__
#define __USB_GLOBAL_H__

typedef unsigned char us_byte;
typedef unsigned short us_short;

#define USB_G_CONF      0x01
#define USB_G_INTF      0x00

#define READ_BUS_TIMEOUT    (5 * 1000)//(3 * 60 * 1000)
#define READ_BUS_CONFIRM_TIMEOUT    (500)

#define TRANSFER_DELAY_MS     500
#define TRANSFER_SPACE_MS     100

#define BUFFER_MAX_LENGTH        512
#define BUFFER_MAX_DATA_LENGTH        (BUFFER_MAX_LENGTH - 18)
#define USP_FIX_PRINTDPI_PARA        (100 / 2.54)

#define LOG_LOCAL_PATH    "./"

///////////////////////////////////
#define IMAGE_FIXED_WIDTH 1008
#define IMAGE_FIXED_HEIGHT 2000
#define IMAGE_CODE_FIXED_HEIGHT 1000

#define ERR_USB_FIND_BUS        0xE000
#define ERR_USB_FIND_DEV        0xE001
#define ERR_USB_STATIC_READ            0xE002
#define ERR_USB_STATIC_WRITE        0xE003
#define ERR_USB_DONT_OPEN        0xE004
#define ERR_USB_SET_CONFIG        0xE005
#define ERR_USB_SET_CLAIM        0xE006
#define ERR_TRANS_ACK            0xE101 //
#define ERR_TRANS_DATA            0xE102 // crc check code
#define ERR_TRANS_NULLSTR        0xE103 // null data
#define ERR_TRANS_MISSONE        0xE104 // miss package
#define ERR_TRANS_TOOLONG        0xE105 // package is too long
#define ERR_TRANS_PARA            0xE106 // para is wrong
#define ERR_TRANS_NOTSEND        0xE107 // send unsuccessfully
#define ERR_TRANS_MALLOC        0xE108 // malloc unsuccessfully
#define ERR_TRANS_UNKNOW        0xE1FF // unknown error
#define ERR_IMAGE_SAVE        0xE200 // image do not save
#define ERR_BILLS_UNKNOW        0xE201 // bills processing error
#define ERR_JSON_FORMAT        0xE202 // json str format is wrong
#define ERR_JSON_PARA        0xE203 // json str para is wrong
#define ERR_JSON_FILE        0xE204 // json file not exist
#define ERR_DEVICE_BUSY         0xE205
#define ERR_UPDATE_FAILED        0xE206 // update failed

typedef enum {
    IMGNumRGB = 0x01,        // 1 票号彩色 01 02 03
    IMGNum_IGRAY,        // 2 票号红外灰度 04
    IMGFrontRGB,        // 3 整票正面彩色 05 06 07
    IMGFloorRGB,        // 4 整票背面彩色 08 09 10
    IMGFront_URGB,        // 5 整票正面紫外反射彩色 11 12 13
    IMGFloor_URGB,        // 6 整票反面紫外反射彩色 14 15 16
    IMG_UTRGB,        // 7 整票紫外透射彩色 17 18 19
    IMGFront_IGRAY,        // 8 整票红外反射正面灰度 20
    IMGFloor_IGRAY,        // 9 整票红外反射反面灰度 21
    IMG_ITGRAY        // 10 整票红外透射灰度 22
}IMAGETYPE;

typedef enum {
    IMG_F_BMP = 0x00,
    IMG_F_JPEG,
    IMG_F_TIFF
}IMAGE_FORMAT;

#endif // USBGLOBAL_H

usbbasic.h

#ifndef __USBBASIC_H__
#define __USBBASIC_H__

#include "libusb.h"
#include "g_header.h"

extern libusb_device_handle *u_devHandle;

#ifdef __cplusplus
extern "C"
{
#endif

    int device_init(void);
    libusb_device_handle* device_openWithID(const us_short u_vid, const us_short u_pid);
    int device_config(libusb_device_handle *u_dev, const int cfg, const int inf);
    int device_config_info_printf();

    void device_close(void);

    int usbBusWrite(us_byte *p_data, int *p_length, int s_timeout = 0);
    int usbBusRead(us_byte *p_data, int *p_length, int s_timeout = 0);

    /**/
    us_short g_getCRC16(const us_byte *p_data, int p_length);

    int execCmdWrite(us_short t_fi, const us_byte *iData, int is_length, int it_length,
                      int iFlag, int iNum, int iClean = 0);
    int execCmdCoder(const us_byte *iData, int iLength, int iClean = 0);
    int execBusClear();
    int execCmdRead(us_byte *iData, int &it_length, int s_timeout = READ_BUS_TIMEOUT);

    int execCmdCfm(int tNum, us_short tFlag);
    int execCfmChk(us_byte *iData, int iNum, us_short iFlag);

//    int execCmdCheck(int tNum, us_short tFlag);

    int execSendData(us_short t_fi, const char *iData, unsigned int iLength, unsigned int iMaxLength,
                     us_short iFlag);
    int execSaveRGBData(char *iData, int &iLength, int iType, us_short iFlag);



#ifdef __cplusplus
}
#endif
#endif // USBBASIC_H

 usbbasic.cpp

#include "usbbasic.h"

#include <qDebug>
#include <QByteArray>

//LIBUSB_ENDPOINT_IN = 0x80     /** In: device-to-host */
#define USB_EP_IN        0x81

//LIBUSB_ENDPOINT_OUT = 0x00        /** Out: host-to-device */
#define USB_EP_OUT        0x01

libusb_device **g_devs;
libusb_device_handle *u_devHandle = NULL;

int device_init(void)
{
    if (u_devHandle) device_close();

    int relt = libusb_init(NULL);
    if (relt < 0) return relt;

    relt = libusb_get_device_list(NULL, &g_devs);
    if (relt < 0) return relt;

    const struct libusb_version * t_version = libusb_get_version();
    qDebug("-- Using libusb v%d.%d.%d.%d",
           t_version->major, t_version->minor, t_version->micro, t_version->nano);

    return relt;
}

libusb_device_handle* device_openWithID(const us_short u_vid, const us_short u_pid)
{
    libusb_device *dev = NULL;
    struct libusb_device_descriptor t_desc;
    libusb_device_handle *t_handle = NULL;

    int ii = 0, relt = 0;
    while ((dev = g_devs[ii ++]) != NULL) {
        relt = libusb_get_device_descriptor(dev, &t_desc);
        if (relt < 0) continue;

        if ((t_desc.idVendor == u_vid) && (t_desc.idProduct == u_pid)) {
            relt = libusb_open(dev, &t_handle);
            break;
        }
    }

    return t_handle;
}

int device_config(libusb_device_handle *u_dev, const int cfg, const int inf)
{
    int relt = 0;

    relt = libusb_kernel_driver_active(u_dev, 0);
    qDebug() <<"-- set driver active .." <<relt;

    if (1 == relt) {
        relt = libusb_set_auto_detach_kernel_driver(u_dev, 0);
        qDebug() <<"-- set auto driver detach .." <<relt;
    }

    relt = libusb_set_configuration(u_dev, cfg);
    qDebug() <<"-- set configure .." <<relt;
    if (relt < 0) {
    }

    relt = libusb_claim_interface(u_dev, inf);
    qDebug() <<"-- set interface .." <<relt;
    if (relt < 0) {
    }

    return relt;
}

void device_close(void)
{
//    libusb_release_interface(u_dev, USB_G_INTF);
    if (u_devHandle == NULL) return;

    libusb_close(u_devHandle);
    u_devHandle = NULL;

    libusb_free_device_list(g_devs, 1);
    libusb_exit(NULL);

    qDebug() <<"** close device and free ..";
}

int device_config_info_printf()
{
    struct libusb_device_descriptor desc;
    struct libusb_config_descriptor *config;
    int relt = 0;
    struct libusb_device *dev = libusb_get_device(u_devHandle);

    relt = libusb_get_device_descriptor(dev, &desc);
    if (relt < 0) return -1;
    qDebug() <<"-- get device descriptor .." <<relt;
    qDebug() <<"-- Bus:" <<libusb_get_bus_number(dev) <<"device:" <<libusb_get_device_address(dev);
    qDebug("-- device vID pID : %04X - %04X", desc.idVendor, desc.idProduct);

    for (int a = 0; a < desc.bNumConfigurations; a++) {
        relt = libusb_get_config_descriptor(dev, a, &config);
        if (relt < 0) break;
        qDebug() <<"-- get device config descriptor .." <<relt;
        qDebug() <<"\t-- Configure .." <<a;
        qDebug() <<"\t< wTotalLength: \t" <<config->wTotalLength;
        qDebug() <<"\t< bNumInterfaces: \t" <<config->bNumInterfaces;
        qDebug() <<"\t< bConfigurationValue: \t" <<config->bConfigurationValue;
        qDebug() <<"\t< iConfiguration: \t" <<config->iConfiguration;
        qDebug() <<"\t< bmAttributes: \t" <<config->bmAttributes;
        qDebug() <<"\t< MaxPower: \t" <<config->MaxPower;

        for (int b = 0; b < config->bNumInterfaces; b++) {
            const struct libusb_interface *infa = &config->interface[b];
            for (int c = 0; c < infa->num_altsetting; c ++) {
                const struct libusb_interface_descriptor *altsetting = &infa->altsetting[c];
                qDebug() <<"\t\t-- Interface .." <<c;
                qDebug() <<"\t\t<< bInterfaceNumber: \t" <<altsetting->bInterfaceNumber;
                qDebug() <<"\t\t<< bAlternateSetting: \t" <<altsetting->bAlternateSetting;
                qDebug() <<"\t\t<< bNumEndpoints: \t" <<altsetting->bNumEndpoints;
                qDebug() <<"\t\t<< bInterfaceClass: \t" <<altsetting->bInterfaceClass;
                qDebug() <<"\t\t<< bInterfaceSubClass: \t" <<altsetting->bInterfaceSubClass;
                qDebug() <<"\t\t<< bInterfaceProtocol: \t" <<altsetting->bInterfaceProtocol;
                qDebug() <<"\t\t<< iInterface: \t" <<altsetting->iInterface;
            }
        }
    }
    return 0;
}

int usbBusWrite(us_byte *p_data, int *p_length, int s_timeout)
{
    int iResult = ERR_USB_STATIC_WRITE;
    if (!u_devHandle) return iResult;

//    iResult = libusb_bulk_transfer(u_dev, USB_EP_OUT, p_data, p_length, NULL, s_timeout);
    iResult = libusb_interrupt_transfer(u_devHandle, USB_EP_OUT, p_data, *p_length, NULL, s_timeout);
    qDebug("+ [%03d] %s", (*p_length), QByteArray::fromRawData((char*)p_data, *p_length).toHex(' ').data());
    return (iResult == 0) ? (*p_length) : iResult;
}

int usbBusRead(us_byte *p_data, int *p_length, int s_timeout)
{
    int iResult = ERR_USB_STATIC_READ;
    if (!u_devHandle) return iResult;

//    iResult = libusb_bulk_transfer(u_dev, USB_EP_IN, p_data, BUFFER_MAX_LENGTH, &p_length, s_timeout);
    iResult = libusb_interrupt_transfer(u_devHandle, USB_EP_IN, p_data, BUFFER_MAX_LENGTH, p_length, s_timeout);

    qDebug("- [%03d] %s", (*p_length), QByteArray::fromRawData((char*)p_data, *p_length).toHex(' ').data());
    return (iResult == 0) ? (*p_length) : iResult;
}

us_short g_getCRC16(const us_byte *p_data, int p_length)
{
    us_short cst_H[16] = { 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
        0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, 0xf1 };
    us_short cst_L[16] = { 0x00, 0x21, 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7,
        0x08, 0x29, 0x4a, 0x6b, 0x8c, 0xad, 0xce, 0xef };

    if (0 >= p_length) return 0x00;

    us_byte kh = 0x00, kl = 0x00;
    kh = *p_data;
    if (p_length > 1) kl = *(p_data + 1);
    else kl = 0;

    us_byte j = 0;
    for (int i = 0; i < p_length; i++) {
        j = (us_byte)(kh / 16);
        kh = (us_byte)(kh * 16);
        kh = (us_byte)(kh + (kl / 16));

        kl = (us_byte)(kl * 16);
        if ((i + 2) < p_length) kl = (us_byte)(kl + (*(p_data + i + 2) / 16));

        kh = (us_byte)(kh ^ cst_H[j]);
        kl = (us_byte)(kl ^ cst_L[j]);

        j = (us_byte)(kh / 16);

        kh = (us_byte)(kh * 16);
        kh = (us_byte)(kh + (kl / 16));

        kl = (us_byte)(kl * 16);
        if ((i + 2) < p_length) kl = (us_byte)(kl + (*(p_data + i + 2) & 0x0F));

        kh = (us_byte)(kh ^ cst_H[j]);
        kl = (us_byte)(kl ^ cst_L[j]);
    }

    return (us_short)(kh * 256 + kl);
}

int execCmdCoder(const us_byte *iData, int iLength, int iClean)
{
    int iResult = 0, tCount = iLength;
    if (iLength < 0 || iLength > BUFFER_MAX_LENGTH) return ERR_TRANS_PARA;

    // free Bus Data
    if (1 == iClean) libusb_clear_halt(u_devHandle, USB_EP_IN);

    //
    iResult = usbBusWrite(const_cast<us_byte*>(iData), &tCount);
    if (iResult == ERR_USB_STATIC_WRITE) iResult = ERR_USB_DONT_OPEN;
    else if (iResult <= 0) iResult = ERR_TRANS_NOTSEND;

    return (iResult = 0);
}

int execCmdWrite(us_short t_fi, const us_byte *iData, int is_length, int it_length,
                 int iFlag, int iNum, int iClean)
{
    int iResult = 0;
    if (is_length < 0 || is_length > BUFFER_MAX_DATA_LENGTH) return ERR_TRANS_PARA;
    if (iNum < 0) return ERR_TRANS_PARA;

    // free Bus Data
    if (1 == iClean) libusb_clear_halt(u_devHandle, USB_EP_IN);

    //
    us_byte *iCommands = (us_byte *)malloc(BUFFER_MAX_LENGTH * sizeof(us_byte));
    if (iCommands == NULL) return ERR_TRANS_MALLOC;

    us_byte *pData = iCommands;
    int tCount = 0;
    memset(iCommands, 0x00, BUFFER_MAX_LENGTH * sizeof(char));

    // 10 07
    memset(pData + tCount++, 0x10, sizeof(us_byte));
    memset(pData + tCount++, 0x07, sizeof(us_byte));
    // flag
    memset(pData + tCount++, iFlag, sizeof(us_byte));
    // data length
    memset(pData + tCount++, (us_short)(is_length), sizeof(us_byte));
    memset(pData + tCount++, (us_short)(is_length >> 8), sizeof(us_byte));
    // totle length
    memset(pData + tCount++, (us_short)(it_length), sizeof(us_byte));
    memset(pData + tCount++, (us_short)(it_length >> 8), sizeof(us_byte));
    memset(pData + tCount++, (us_short)(it_length >> 16), sizeof(us_byte));
    memset(pData + tCount++, (us_short)(it_length >> 24), sizeof(us_byte));
    // fi
    memset(pData + tCount++, t_fi, sizeof(us_byte));
    // data
    if (is_length > 0) {
        memcpy(pData + tCount, iData, is_length * sizeof(us_byte));
        tCount += is_length;
    }
    //
    memset(pData + tCount++, (us_short)(iNum), sizeof(us_byte));
    memset(pData + tCount++, (us_short)(iNum >> 8), sizeof(us_byte));
    //
    memset(pData + tCount++, 0x10, sizeof(us_byte));
    memset(pData + tCount++, 0x08, sizeof(us_byte));

    // SRC
    //    int t_crc = g_getCRC16(pData, tCount);
    //    if (0 == t_crc) iResult = ERR_TRANS_DATA;
    //    memset(pData + tCount++, (us_short)(t_crc), sizeof(us_byte));
    //    memset(pData + tCount++, (us_short)(t_crc >> 8), sizeof(us_byte));
    memset(pData + tCount++, 0x00, sizeof(us_byte));
    memset(pData + tCount++, 0x00, sizeof(us_byte));

    // send data
    iResult = usbBusWrite(iCommands, &tCount);
    if (iResult == ERR_USB_STATIC_WRITE) iResult = ERR_USB_DONT_OPEN;
    if (iResult <= 0) iResult = ERR_TRANS_NOTSEND;

    // clean
    free(iCommands);
    pData = iCommands = NULL;

    return iResult;
}

int execBusClear()
{
    int iResult = 0, i_len = 0;

    us_byte *iData = (us_byte*)malloc(BUFFER_MAX_LENGTH * sizeof(char));
    if (!iData) return ERR_TRANS_MALLOC;

    do {
        memset(iData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
        iResult = usbBusRead(iData, &i_len);

        Sleep(10);
    }while((0 != iResult) && (ERR_USB_STATIC_READ != iResult));

    free(iData);
    return iResult;
}

int execCmdRead(us_byte *iData, int &it_length, int s_timeout)
{
    int iResult = 0;
    long iEndTime = 0, iStartTime = GetTickCount();
    do {
        iResult = usbBusRead(iData, &it_length);

        if (0 == iResult) Sleep(TRANSFER_SPACE_MS);
        iEndTime = GetTickCount();

    } while (iResult <= 0 && (iEndTime - iStartTime) < s_timeout);

    return iResult;
}

int execCmdCfm(int tNum, us_short tFlag)
{
    int iResult = 0, iCount = 0;
    if (tNum < 0) return ERR_TRANS_PARA;

    us_byte *iCommands = (us_byte *)malloc(BUFFER_MAX_LENGTH * sizeof(char));
    if (iCommands == NULL) return ERR_TRANS_MALLOC;

    memset(iCommands, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
    us_byte *t_pdata = iCommands;
    // 10 05 00 00 00
    memset(t_pdata + iCount ++, 0x10, sizeof(us_byte));
    memset(t_pdata + iCount ++, 0x05, sizeof(us_byte));
    memset(t_pdata + iCount ++, tFlag, sizeof(us_byte));
    memset(t_pdata + iCount ++, (us_short)(tNum >> 0), sizeof(us_byte));
    memset(t_pdata + iCount ++, (us_short)(tNum >> 8), sizeof(us_byte));

    iResult = usbBusWrite(iCommands, &iCount);
    if (iResult == ERR_USB_STATIC_WRITE) iResult = ERR_USB_DONT_OPEN;
    if (iResult <= 0) iResult = ERR_TRANS_NOTSEND;

    // clean
    free(iCommands);
    t_pdata = iCommands = NULL;

    return iResult;
}

int execCfmChk(us_byte *iData, int iNum, us_short iFlag)
{
    if ((int)iData[0x00] != 0x10) return -1;
    if ((int)iData[0x01] != 0x06) return -1;
    if ((int)iData[0x02] != iFlag) return -1;

    int i_num = ((int)iData[0x04] << 8) + ((int)iData[0x03]);
    if (i_num != iNum) return -1;

    return 0;
}

//int execCmdCheck(int tNum, us_short tFlag)
//{
//    int iResult = 0, iLen = BUFFER_MAX_LENGTH;

//    us_byte *tData = (us_byte*)malloc(BUFFER_MAX_LENGTH * sizeof(char));
//    if (!tData) return ERR_TRANS_MALLOC;

//    memset(tData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
//    long iEndTime = 0, iStartTime = GetTickCount();

//    do {
//        iResult = usbBusRead(tData, &iLen);

//        if (((int)tData[0x00] == 0x10) && ((int)tData[0x01] == 0x06) && ((int)tData[0x02] == tFlag)
//            && (((int)tData[0x04] << 8) + ((int)tData[0x03])) == tNum) break;
//        else {
//            iResult = 0;
//            memset(tData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
//        }

//        if (0 >= iResult) Sleep(TRANSFER_SPACE_MS);
//        iEndTime = GetTickCount();

//    } while (iResult <= 0 && (iEndTime - iStartTime) < READ_BUS_CONFIRM_TIMEOUT);

//    free(tData);
//    return (0 == iResult) ? ERR_DEVICE_BUSY : iResult;
//}
int execSendData(us_short t_fi, const char *iData, unsigned int iLength, unsigned int iMaxLength,
                 us_short iFlag)
{
    if (iMaxLength > BUFFER_MAX_DATA_LENGTH) return ERR_TRANS_PARA;
    if (NULL == iData) return ERR_TRANS_PARA;

    int iResult = 0, iReadRst = 0, i_Num = 0, tmp_len = 0;
    us_byte *tp_data = (us_byte*)iData;
    unsigned int t_data_length = iLength, ts_l = 0;

    us_byte *pRevData = (us_byte*)malloc(BUFFER_MAX_LENGTH * sizeof(us_byte));
    memset(pRevData, 0x00, BUFFER_MAX_LENGTH * sizeof(us_byte));

    do {
        ts_l = (iLength < iMaxLength) ? t_data_length : iMaxLength;
        iResult = execCmdWrite(t_fi, (us_byte*)tp_data, ts_l, iLength, iFlag, i_Num);
        if ((0xDFFF < iResult) && (iResult < 0xEFFF)) break;

        // 10 05
        iReadRst = execCmdRead(pRevData, tmp_len, READ_BUS_CONFIRM_TIMEOUT);
        iResult = (0 == iReadRst) ? ERR_DEVICE_BUSY : 0;
        iResult = execCfmChk(pRevData, (i_Num ++), iFlag);

        if (0 != iResult) break;

        // == ==
        t_data_length   -= ts_l;
        tp_data         += ts_l;

        iResult = execCmdCfm((i_Num ++), iFlag);
        memset(pRevData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
        iReadRst = execCmdRead(pRevData, tmp_len);

        if (iReadRst >= 18)
        {
            int ii_flag = (int)pRevData[10] + ((int)pRevData[11] << 8);
            iResult = (0 == ii_flag) ? ii_flag : ((int)pRevData[12]);
        }
        else iResult = ERR_TRANS_DATA;

        // == == == ==
        if (0 != iResult) break;
    }while(t_data_length > 0);

    free(pRevData);
    return iResult;
}

int execSaveRGBData(char *iData, int &iLength, int iType, us_short iFlag)
{
    us_byte * t_fi_data = (us_byte*)malloc(sizeof(us_byte));
    memset(t_fi_data, 0x00, sizeof(us_byte));
    memset(t_fi_data, (us_short)iType, sizeof(us_byte));

    int iResult = 0, iReadRst = 0, i_len = 0;
    iResult = execCmdWrite(0xF0, t_fi_data, 0x01, 0x01, iFlag, 0x00);
    free(t_fi_data);
    if ((0xDFFF < iResult) && (iResult < 0xEFFF)) return iResult;

    us_byte *pRevData = (us_byte*)malloc(BUFFER_MAX_LENGTH * sizeof(char));
    memset(pRevData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));
    iReadRst = execCmdRead(pRevData, i_len, READ_BUS_CONFIRM_TIMEOUT);

    iResult = (0 == iReadRst) ? ERR_DEVICE_BUSY : 0;
    iResult = execCfmChk(pRevData, 0x00, iFlag);
    if (0 != iResult) return iResult;

    iResult = execCmdCfm(0x01, iFlag);

    // -- -- -- --
    int t_length = 0, t_total = 0;
    do {
        memset(pRevData, 0x00, BUFFER_MAX_LENGTH * sizeof(char));

        iReadRst = usbBusRead(pRevData, &i_len);

        if (0 == iReadRst) continue;

        // count data length
        int t_single = ((int)pRevData[4] << 8) + (int)pRevData[3];
        if (0 == t_total) {
            t_total +=  (int)pRevData[5];
            t_total += ((int)pRevData[6] << 8);
            t_total += ((int)pRevData[7] << 16);
            t_total += ((int)pRevData[8] << 24);
        }

        memcpy(iData + t_length, pRevData + 12, t_single * sizeof(char));
        t_length += t_single;
    } while (t_length < t_total);
    iLength = t_total;

    free(pRevData);
    return 0x00;
}

工程源码 :GitHub - DaemonHuan/libusb-usp-api

周立功 USBCAN-II 驱动 Ubuntu 22.04 安装:libusb-1.0 依赖与 3 步权限配置 本文详细介绍了在Ubuntu 22.04系统上安装周立功USBCAN-II驱动的完整流程,包括libusb-1.0依赖安装、驱动编译与部署,以及永久权限配置。通过3步权限设置和udev规则,确保设备稳定运行,适用于工业通信和CAN总线开发。 阅读详情

相关推荐

交叉编译libusb和libusb-compat-0.1.5

1. 下载libusb库: https://jaist.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.22/libusb-1.0.22.tar.bz2 2. 编译安装libusb: tar -xvf ./libusb-1.0.22.tar.bz2 cd ./libusb-1.0.22 mkdir build ./configure...

不忘初心,方得始终。 1565

libusb接口说明

网址:https://blog.csdn.net/FlayHigherGT/article/details/89297462 1 libusb_init 函数原型:int libusb_init(libusb_context **ctx); 功能说明:该函数进行libusb的初始化,必须最先调用。 参数说明:ctx通常设置NULL 返回值:0成功,非0 失败 2 libusb_exit 函数原型:void libusb_exit(libusb_context *ctx); 功能说明:和libusb_ini

qq_36740578的博客 1974

【libusb】 一.安装

1.libusb 下载 https://libusb.info/ 2.安装 步骤: 1、环境 Ubuntu 16.04 2、安装主要分3个步骤,如下: a:执行./configure来配置安装包。 b:执行make编译该安装包。 c:执行make install安装 3.具体执行步骤: (1)下载的libusb.tar.gz 解压 tar xjvf libusb-1.0.22.tar.bz2 (2) ./configure–build=x86_64-linux --disable-udev

朝花夕拾 6390

通用usb驱动libusb介绍和使用示例

 sudo insmod /lib/modules/2.6.22-14-generic/kernel/drivers/usb/serial/usbserial.ko vendor=0x8086 product=0xd001同时插上ttyUSB0和ttyUSB1(ch341),obm可以将dkb下载下去,但是自动重起之后,就不能下载接下来的东西了,所以应该,需要close(ttyUSB0_handl

7455

Ubuntu 22.04 LTS下libusb-1.0.24安装避坑指南(附常见报错解决方案)

本文详细解析了在Ubuntu 22.04 LTS系统上从源码编译安装libusb-1.0.24的完整流程与常见陷阱。内容涵盖环境准备、依赖安装、编译配置、权限设置及多版本管理,并重点提供了编译错误、权限不足等典型问题的解决方案,帮助开发者高效完成libusb部署。

weixin_28835789的博客 362

Kinect一代Linux驱动源码包:含深度/RGB采集、云台控制与多示例程序

一套开箱即用的Kinect一代硬件驱动代码,专为Linux系统设计,基于libusb-1.0实现底层USB通信。支持实时获取深度图像和RGB视频流,可精确控制电机云台倾角(tilt),完成设备初始化、传感器同步与电源管理。不包含麦克风阵列支持,但所有主流视觉传感器功能均可直接调用。代码采用标准C语言编写,结构清晰,核心模块包括core.c(主控逻辑)、cameras.c(图像采集)、tilt.c(云台控制)、usb_libusb10.c(USB协议适配)。配套提供多个实用示例:glview.c(OpenGL

rain6的博客 196

windows mingw-gcc 中使用 libusb-1.0.22

1. libusb-1.0.22 简单介绍 官网:http://www.libusb.org/ libusbx之前是lisbusb一个分支,现在已经合并到Libusb上了。 libusb是一个C库,它提供了通用的访问USB设备。 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序。libusb是一个开源库,允许你从用户空间与USB设备通信。 更多信息,请参阅libusb主页。 可移植的: 使用一个跨平台API,它提供了访问USB设备在Linux上,OS X Windows,...

Daemon09080的博客 1188

libusb-1.0.22:跨平台USB开源库详解与实践

libusb 是一个在多种操作系统上操作USB设备的跨平台库。它允许开发者通过编写程序直接与USB设备通信,无需依赖于操作系统的原生驱动程序。这一点对于嵌入式设备、测试工具以及需要自定义控制设备行为的应用来说尤其重要。热插拔是指在不关闭系统电源的情况下连接或断开USB设备。在libusb中,热插拔检测是通过监听系统事件来实现的。当有新的USB设备连接到系统时,libusb可以通知应用程序,这允许应用程序响应设备的连接和断开。

weixin_34725745的博客 1326

libusb-1.0-22源码下载仓库介绍:USB通信库,实现设备控制

libusb-1.0-22源码下载仓库介绍:USB通信库,实现设备控制 【下载地址】libusb-1.0-22源码下载仓库介绍 本仓库提供libusb-1.0-22的源码,这是一个功能强大的库,用于实现操作系统与USB设备之间的通信。通过编译该源码,您可以轻松将其集成到项目中,从而实现对USB设备的访问和控制。无论是数据...

gitblog_06777的博客 1049

全志A33处理器上libusb-1.0.22库测试指南

全志A33处理器是一款低功耗、高性能的四核处理器,广泛应用于各类智能硬件设备。由于其出色的计算能力和低能耗特性,被广泛应用于平板电脑、智能终端、穿戴设备等领域。全志A33内置了高效能的ARM Cortex-A7处理器,主频最高可达1.2GHz,配备的Mali-400 MP2 GPU支持多格式的视频播放和高分辨率显示。libusb是一个跨平台的库,它为开发人员提供了一个在不同操作系统上访问USB设备的统一接口。它广泛应用于需要直接与USB设备进行交互的应用程序中,如硬件测试、诊断工具或通用设备控制程序。

weixin_31659095的博客 811

libusb通讯例子

linux/ubuntu下用libusb开源的库实现usb和国民芯片的usb通讯,linux是host主机,M0是从机设备,通讯测试通过。

libusb-1.0-22源码下载仓库介绍

libusb-1.0-22源码下载仓库介绍 【下载地址】libusb-1.0-22源码下载仓库介绍 本仓库提供libusb-1.0-22的源码,这是一个功能强大的库,用于实现操作系统与USB设备之间的通信。通过编译该源码,您可以轻松将其集成到项目中,从而实现对USB设备的访问和控制。无论是数据传输还是设备管理,libus...

gitblog_06775的博客 499

libusb-1.0.22.zip_libusb_libusb 源码_libusb-1.0.22_libusb1_usbdk+l

实现usb设备免驱数据操作,官方最新源码

Linux libusb USB开发(二)—— libusb安装与调试

一、libusb 下载 在官网http://libusb.info/可以下载到,如下图: 下载里面的 libusb-1.0.22.tar.bz2  二、libusb的安装  1、环境 Ubuntu 16.04  2、安装主要分3个步骤,如下: a:执行./configure来配置安装包。 b:执行make编译该安装包。 c:执行make install安装 3、具体操作流...

爱机械的假程序猿的博客 1万+

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 481

图像去噪实战:Noise2Noise与Noise2Void在医学影像中的应用(附代码)

本文深入探讨了Noise2Noise与Noise2Void在医学影像去噪中的革命性应用,通过自监督学习技术有效解决临床数据配对难题。文章提供详细的代码实现和临床部署方案,展示如何提升低剂量CT、MRI等影像的诊断质量,特别适用于辐射敏感场景和急诊快速处理。

weixin_29092579的博客 241

python libusb_libusb介绍和使用示例

sudo insmod /lib/modules/2.6.22-14-generic/kernel/drivers/usb/serial/usbserial.ko vendor=0x8086 product=0xd001同时插上ttyUSB0和ttyUSB1(ch341),obm可以将dkb下载下去,但是自动重起之后,就不能下载接下来的东西了,所以应该,需要close(ttyUSB0_handle...

weixin_39895167的博客 1788

MTK Linux Charger驱动分析(二) - power_supply_core.c

的核心作用可以概括为:提供统一的电源管理框架;管理电源设备注册、属性访问、事件通知;封装sysfs 接口和 uevent 通知,屏蔽硬件细节;驱动开发者只需要实现,不关心底层通知和接口细节。简单来说,它是电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。

iTom1900 1488

Libusb移植和测试

Libusb交叉编译和移植某项目内核需要支持USB的相关操作,所以考虑移植Libusb库1、到官网下载最新的libusb源码(1.0.22)2、解压源码3、进入解压后的文件夹进行交叉编译5、将动态库复制到当前系统的/lib下6、libusb-compat的安装7、将libusb移植到单板8、制作测试程序的Makefile文件9、编译过程遇到的问题 某项目内核需要支持USB的相关操作,所以考虑移植L...

weixin_40983190的博客 4085

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3108

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章

Python浙大版PTA题解

wzhh_的博客 5525

libusb不同环境下的安装和使用

libusb使用c实现, 具有的跨平台的特性,目前支持的操作系统有:Linux、macOS、Windows、OpenBSD/NetBSD、Haiku、Solaris。

dmf_fff的博客 9412

告别玄学调试:手把手教你读懂全志芯片的sys_config.fex配置文件(以i2c配置为例)

本文深入解析全志芯片的sys_config.fex配置文件,以I2C设备驱动为例,详细讲解从引脚定义到驱动加载的全过程。通过实战案例和高级调试技巧,帮助开发者快速掌握硬件配置与内核驱动的联动机制,提升开发效率。

weixin_33737134的博客 418

libusb系列-002-Windows下libusb源码编译

这篇是临时凑出来的一篇,因为下面要写怎么在`Qt`使用`libusb`库,所以这篇就得编译出`libusb`库。本篇为`windows`编译`libusb`库。

DreamLife&Yaothos 3664

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接)

本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。

weixin_33712987的博客 771

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8405
上一篇: windows mingw-gcc 中使用 libusb-1.0.22
下一篇: CFramelessWidget 基于Qt::FramelessWindowHint 的QWidget
HuAN-WriteDemo
博客等级 码龄9年 239粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值