- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 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欢迎任何提示
此致于尔根
代码
取自
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 -v
或 usb-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 -v
或 usb-devices
以获得正确的信息......
关于linux - libusb 无法声明设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44919347/
正在尝试安装 rtl-sdr (通过 git clone git://git.osmocom.org/rtl-sdr.git )感谢说明 here但不能超过 make在第一个指令序列中: cd rtl
好吧,我可能在做一些愚蠢的事情,但我无法让 libusb 让我终生将数据传输到我的设备。 代码: #include #include #include #include #include #
我运行这个 libusb_control_transfer(usb_handle,0xA1, 1, 0, 1, buf, 0x800, 1000); 并得到错误 libusb:error [submi
libusb 可让您通过设备的供应商和产品 ID 查找设备。但是,如果我有多个连接了相同 VID 和 PID 的设备,并且想通过知道其中一个的序列号来获取其中一个的句柄怎么办?有一个 libusb_o
我目前在Windows 7开发人员中。工作环境以获取使用libusbdotnet初始化的设备。 该设备(USB大容量存储设备)使用Windows的默认USB-MASS Storage驱动程序连接并运行
我正在尝试使用 libusb1.0.9 实现用户空间 USB 驱动程序。我有 lpc2148 蓝板(ARM7)。这个板由 Bertrik Sikken 先生加载了开源 USB 堆栈/固件。现在我的用户
我知道这件事太简单了,我会恨自己不得不问这个问题,但我的头因反复点击桌面而感到疼痛。我已经阅读了数十个 stackoverflow 和 google 结果,这些结果表明以下内容应该有效: $ ls /
我知道关于这个问题有很多问题,但具体来说我在 Ubuntu 上实现 libusb 库时遇到了问题。这是我的代码: struct usb_bus *busses; struct usb_bus *bus
我需要一些有关 Java 中 IllegalStateException 的帮助。我得到了一个应该从 USB 设备读取数据的源代码。 该代码尚未完成,但我已经收到以下错误报告 Exception in
我使用 libusb-1.0.9 和 NDK (Android 4.0.4+) 编写 Android 应用程序,它必须从 USB 声卡读取音频数据。来自 libusb 的 USB 设备成功打开,并且可
我正在编写的应用程序的一部分使用 libusb 与设备通信,我很难测试我的代码。是否有创建假 usb 设备的框架或其他模拟 libusb 的方法,以便更好地自动化测试、能够在 CI 上进行测试、重现边
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我知道我的问题很基础,我有点不好意思问。所以我在我的 Oculus Rift 上使用 VRUI 时遇到了一些问题,而且我遇到了 USB 问题,所以为了进行完整性检查,我下载了 libusub-1.0.
我正在运行 Ubuntu 12.04 编译一个包含以下代码的 c++ 文件 #include #include using namespace std; int main(){ //poi
我正在尝试构建一个使用 libusb 的程序,但出现了很多错误,例如 i2cbrdg.c:84: error: implicit declaration of function ‘usb_init’
在 Linux 中使用 libusb 时是否有批量传输的最大长度? 例如,您可以传递任何正值作为函数 libusb_fill_bulk_transfer 的长度参数吗? 最佳答案 理论上它是目标系统上
我正在尝试使用 libusb-1.0 和 QtUsb 库访问 USB 设备。在我做一些更新之前,它是一个简单的批量设备。目前我在用 Linux nadhh.fritz.box 4.11.8-200.f
我正在编写一个简单的库,它使用 libusb 连接到我的自定义硬件,每 50 毫秒向主机设备发送一次信号。它旨在提供一个简单的抽象层,以便用户根本不会为 libusb 所困扰。我需要将指向非静态类成员
我使用 libusb 来枚举一些 USB 设备。现在我想获得“设备路径”。我认为它不叫 usb device-path,因为我用 google 没有成功。 如果我将 usb 设备与 linux 连接,
我正在使用此教程 link发送一个字符串以将其打印出来。然而,即使打印机显示“正在接收数据”,数据也不会被打印。在代码本身中,libusb_bulk_transfer 返回我想要打印的字符串中的字符数
我是一名优秀的程序员,十分优秀!