gpt4 book ai didi

linux - libusb 无法声明设备

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:54 26 4
gpt4 key购买 nike

我正在尝试使用 libusb-1.0 和 QtUsb 库访问 USB 设备。在我做一些更新之前,它是一个简单的批量设备。目前我在用

Linux nadhh.fritz.box 4.11.8-200.fc25.x86_64 #1 SMP Thu Jun 29 16:13:56 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

如果我以用户或 root 身份运行并不重要,因为设备将被 udev 设置为用户组和权限 666

[timestamp] [threadID] facility level [function call] <message>
--------------------------------------------------------------------------------
[ 0.012281] [00000fc6] libusb: error [op_get_configuration] device unconfigured
Type:1, cat:default, file:../src/qlibusb.cpp, line:114, f:virtual qint32 QUsbDevice::open(), msg:Cannot Claim Interface
Type:1, cat:default, file:../src/qlibusb.cpp, line:168, f:void QUsbDevice::printUsbError(int), msg:libusb Error: Entity not found
[ 0.951403] [00000fc6] libusb: warning [libusb_exit] application left some devices open

如果我以用户或 root 身份运行并不重要,因为设备将由 udev 设置为用户组和权限 666欢迎任何提示

此致于尔根

代码

取自

QtUsb

Qt 的跨平台 USB 库。依赖于 libusb-1.0。

特点

  • 批量转移
  • 设备插入/移除检测
  • 设备搜索

待办事项

  • 中断传输
  • 同步传输

用法

文档还不完整,大家可以同时看看例子。

文档

Doxygen 文档可以在这里找到:http://fpoussin.github.io/doxygen/qtusb/

下载

Ubuntu PPA:https://launchpad.net/~fpoussin/+archive/ubuntu/ppaWindows 库即将推出。

标题

    #ifndef USBEXAMPLE_H
#define USBEXAMPLE_H

#include <QObject>
#include <QUsb>

const quint8 USB_PIPE_IN = 0x81; /* Bulk output endpoint for responses */
const quint8 USB_PIPE_OUT = 0x01; /* Bulk input endpoint for commands */
const quint16 USB_TIMEOUT_MSEC = 300;

const quint16 vendor_id = 0x04e3;
const quint16 product_id= 0x0001;

class UsbExample : public QObject
{
Q_OBJECT
public:
explicit UsbExample(QObject *parent = 0);
~UsbExample(void);
void setupDevice(void);
bool openDevice(void);
bool closeDevice(void);
void read(QByteArray *buf);
void write(QByteArray *buf);

signals:

public slots:

private:
QUsbManager mUsbManager;
QUsbDevice* mUsbDev;

QtUsb::DeviceFilter mFilter;
QtUsb::DeviceConfig mConfig;
};

#endif // USBEXAMPLE_H

cpp

    #include <iostream>
#include "usbexample.h"

using namespace std;

#ifdef interface
#undef interface
#endif

UsbExample::UsbExample(QObject *parent) : QObject(parent) {
this->setupDevice();

QByteArray send, recv;

send.append(".[]=R00[]=R01[]=R02$");

if (this->openDevice()) {
cerr << "Device open!" << endl;
this->write(&send);
this->read(&recv);
}
}

UsbExample::~UsbExample() { delete mUsbDev; }

void UsbExample::setupDevice() {
/* There are 2 ways of identifying devices depending on the platform.
* You can use both methods, only one will be taken into account.
*/

mUsbDev = new QUsbDevice();
mUsbDev->setDebug(true);

#if 1
// Bus 003 Device 004: ID 04e3:0001 Zilog, Inc.
mFilter.pid = 0x0001;
mFilter.vid = 0x04E3;
#else
mFilter.vid = 0x0c4b;
mFilter.pid = 0x0400;
#endif

//
mConfig.alternate = 0;
mConfig.config = 0;
mConfig.interface = 0;
mConfig.readEp = 0x81;
mConfig.writeEp = 0x02;
}

bool UsbExample::openDevice() {
cerr << "Opening" << endl;

QtUsb::DeviceStatus ds;

ds = mUsbManager.openDevice(mUsbDev, mFilter, mConfig);

if (ds == QtUsb::deviceOK) {
// Device is open
return true;
}
return false;
}

bool UsbExample::closeDevice() {
cerr << "Closing" << endl;
mUsbManager.closeDevice(mUsbDev);
return false;
}

void UsbExample::read(QByteArray *buf) { mUsbDev->read(buf, 1); }

void UsbExample::write(QByteArray *buf) { mUsbDev->write(buf, buf->size()); }

#include "usbexample.h"
#include <QCoreApplication>
#include <QTimer>
#include <iostream>


void customLogHandler(QtMsgType type, const QMessageLogContext& context,
const QString& msg)
{
// send the data to log file via the other thread
// emit writeToFile(type, context, msg);

// now output to debugger console
#ifdef Q_OS_WIN
OutputDebugString(text.toStdWString().c_str());
#else
std::cerr << "Type:" << type << ", cat:" << context.category << ", file:" << context.file
<< ", line:" << context.line
<< ", f:" << context.function << ", msg:" << msg.toStdString() << std::endl;
#endif
}


int main(int argc, char *argv[]) {
qInstallMessageHandler(&customLogHandler);
QCoreApplication a(argc, argv);
QTimer timer;

QObject::connect(&timer, SIGNAL(timeout()), &a, SLOT(quit()));

timer.setInterval(1000);
timer.setSingleShot(true);
timer.start();

UsbExample example;

return a.exec();
}

最佳答案

这是配置的问题。在 USB 中你必须遵守层次结构

设备描述符 - 配置描述符 - 接口(interface)描述符 - 端点描述符

( http://www.beyondlogic.org/usbnutshell/usb1.shtml )

如果配置级别有错误,所有其他级别也会失败

很可能错误在这段代码中:

  mConfig.alternate = 0;
mConfig.config = 0;
mConfig.interface = 0;
mConfig.readEp = 0x81;
mConfig.writeEp = 0x02;

问题是我不知道你设备的 USB 树结构,所以你必须这样做。您可以通过 lsusb -vusb-devices 获取结构并在您的设备中搜索结构顺序 'device - configuration - interface - endpoint '

如果你有信息你必须修改上面的代码(即改变接口(interface)索引,替代设置,...)

源码的关键部分是

int conf;
libusb_get_configuration(mDevHandle, &conf);

if (conf != mConfig.config) {
if (mDebug) qDebug("Configuration needs to be changed");
rc = libusb_set_configuration(mDevHandle, mConfig.config);
if (rc != 0) {
qWarning("Cannot Set Configuration");
this->printUsbError(rc);
return -3;
}
}
rc = libusb_claim_interface(mDevHandle, mConfig.interface);
if (rc != 0) {
qWarning("Cannot Claim Interface");
this->printUsbError(rc);
return -4;
}

来源:https://github.com/fpoussin/QtUsb/blob/master/src/qlibusb.cpp

这就是“无法声明接口(interface)”错误消息的来源,因为设置准确的配置存在问题。如前所述,请尝试 lsusb -vusb-devices 以获得正确的信息......

关于linux - libusb 无法声明设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44919347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com