我正在尝试在我的操作系统上设置libusb API.我在libusb.org上下载了libusb api.我遵循标准安装程序:
cd into directory
./configure
make
make check //without errors
make install
Run Code Online (Sandbox Code Playgroud)
然后我启动了Eclipse C/C++并从互联网上的教程中复制了一些代码.但是在尝试构建它时,我得到了以下输出:
main.cpp:(.text+0x19): undefined reference to `libusb_init'
main.cpp:(.text+0x76): undefined reference to `libusb_set_debug'
main.cpp:(.text+0x8a): undefined reference to `libusb_get_device_list'
main.cpp:(.text+0x136): undefined reference to `libusb_free_device_list'
main.cpp:(.text+0x142): undefined reference to `libusb_exit'
/tmp/ccOWJGwe.o: In function `printdev(libusb_device*)':
main.cpp:(.text+0x162): undefined reference to `libusb_get_device_descriptor'
main.cpp:(.text+0x28a): undefined reference to `libusb_get_config_descriptor'
main.cpp:(.text+0x4d4): undefined reference to `libusb_free_config_descriptor'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我在/ lib中有libusb.so,我在/ usr/local/include中有usb.h,在/ usr/local/lib中有.so和libusb.a的链接.
代码中的#include也是正确的.
我知道问题出现在链接器中但是我有点不能使它工作:)
我正在使用Fedora 15操作系统和gcc 4.6.0 20110603(Red Hat 4.6.0-10)版本编译器.
那么我该怎么办才能解决这些未定义的引用呢?非常感谢你的帮助:)
我正在尝试使用libusb,但是我收到以下错误消息:
usbfs:process 24665(myprogram)在使用前没有声明接口0
我真的不明白为什么,因为据我所知,我是根据图书馆的描述来做的.这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <libusb.h>
int main(void)
{
int result;
struct libusb_device_descriptor desc;
libusb_device **list;
libusb_device *my_device = NULL;
result = libusb_init(NULL);
libusb_set_debug(NULL, 3);
ssize_t count = libusb_get_device_list(NULL, &list);
for (int i = 0; i < count; i++) {
libusb_device *device = list[i];
result = libusb_get_device_descriptor(device, &desc);
if((desc.idVendor == 0x03f0) && (desc.idProduct == 0x241d)) {
my_device = device;
break;
}
}
if(my_device != NULL) {
libusb_device_handle *handle;
result = libusb_open(my_device, &handle); …Run Code Online (Sandbox Code Playgroud) 我一直在Linux上使用LibUSB开发USB驱动程序,但现在我想为Windows编译我的一个驱动程序(这是我第一次这样做).
我正在使用MinGW编译器(也使用Dev-cpp IDE)在Windows 7上工作,我正在使用从此链接下载的预编译的libusb库.
我的设备:这是一款HID触控设备.因此Windows不需要驱动程序.我有一个额外的端点来获取某些调试数据.
我已编译代码列出连接到我的机器的所有设备和USB设备,代码可以工作.现在我添加代码来打开设备,以便获得设备句柄并开始通信.但是函数返回-12即LIBUSB_ERROR_NOT_SUPPORTED.
我该如何解决这个问题?
我在互联网上搜索并没有找到解决这个问题的明确方法.虽然它的代码在Linux上运行得很好.
PS:我在下面添加了整个代码.该DoList();函数工作正常,但GetTRSDevice();函数失败 libusb_open(dev, &handle);.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>
libusb_device_handle* deviceHandle = NULL;
int DoList();
libusb_device_handle* GetTRSDevice(void);
int main()
{
int ret = libusb_init(NULL);
if (ret < 0) {
printf("Failed to init libusb");
return ret;
}
DoList();
deviceHandle = GetTRSDevice();
if(!deviceHandle) {
printf("Failed to locate device");
goto fail_dev_open;
}
printf("Device opened");
libusb_close(deviceHandle);
fail_dev_open:
libusb_exit(NULL);
return(ret); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译libusb包提供的示例libusb.c(如果你是源代码.)
至少可以说它没有用.
#include <stdio.h>
#include <sys/types.h>
#include <libusb/libusb.h>
Run Code Online (Sandbox Code Playgroud)
这导致它失败,没有libusb/libusb.h它usb.h,所以我改变了.它以新的和创新的方式失败了.
我已经完全复制了文件,并将其命名为example.c
我正在使用这些命令和变体:
gcc -o example example.c -lusb -L /usr/lib/libusb.a
gcc -o example example.c -lusb -L /usr/lib/libusb.so
Run Code Online (Sandbox Code Playgroud)
编译时遇到的错误是:
example.c:25: error: expected ‘)’ before ‘*’ token
example.c: In function ‘main’:
example.c:46: error: ‘libusb_device’ undeclared (first use in this function)
example.c:46: error: (Each undeclared identifier is reported only once
example.c:46: error: for each function it appears in.)
example.c:46: error: ‘devs’ undeclared (first use in this function)
Line 25: static void …Run Code Online (Sandbox Code Playgroud) 我正在研究如何在Linux中与USB设备进行通信,而不愿意编写Linux内核驱动程序.我知道libusb存在并且是一个可以工作的用户区域库,但是我们的嵌入式设备不支持usbfs(并且真的很难改变内核以添加支持).
所以我的问题基本上是这样的:通过直接读取/写入/ dev/USB或USB设备对应的udev文件,是否可以/建议与USB设备通信,从而绕过对自定义Linux驱动程序和usbfs的需求?
我希望一旦/ dev/USB或udev设备文件打开,只需通过文件类型的读/写命令直接读/写协议包,就可以使用USB设备协议进行通信.
请提出意见和建议.
跟进:
由于我需要与之通信的USB设备是USB HID类设备,我可以通过直接读/写/ dev/hidraw0(或相应的/ dev/hidraw设备)来使用libudev和标准的Linux USB HID RAW驱动程序.没有必要为简单的USB HID设备编写自定义驱动程序.
我正在尝试通过OTG与基于Android的智能手机的USB设备进行通信.我能够使用Android USB Host API与我的设备通信.USB Host API解决方案的问题是性能(单个批量传输受16384字节限制).
libusb可以执行更大的请求,现在我尝试使用Android NDK集成它.我成功编译了Android的libusb源甚至initUSB(),但libusb_open(dev, &dev_handle)返回-3(拒绝访问).
如何传递文件描述符
int fd = connection.getFileDescriptor()
Run Code Online (Sandbox Code Playgroud)
在Android USB Host API下获取USB_PERMISSION并在libusb下获取USB设备后访问libusb?
我已经尝试从设备(USB温度计)获取数据,遵循此文档https://www.npmjs.org/package/usb,但我没有任何结果.
为了从设备获取温度数据,我应该发送类似'd \n'的数据.
这是我的代码:
var usb = require('usb'),
term = usb.findByIds(65535, 2);
term.open();
var endpoints = term.interfaces[0].endpoints,
inEndpoint = endpoints[0],
outEndpoint = endpoints[1];
inEndpoint.transferType = 2;
inEndpoint.startStream(1, 64);
inEndpoint.transfer(64, function (error, data) {
if (!error) {
console.log(data);
} else {
console.log(error);
}
});
inEndpoint.on('data', function (data) {
console.log(data);
});
inEndpoint.on('error', function (error) {
console.log(error);
});
outEndpoint.transferType = 2;
outEndpoint.startStream(1, 64);
outEndpoint.transfer(new Buffer('d\n'), function (err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
跑完后我得到了这个:
D:\Dev\USBTest\node_modules\usb\usb.js:261
t.submit(new Buffer(self.streamTransferSize), transferDone)
^
Error: LIBUSB_ERROR_NOT_FOUND
at startTransfer (D:\Dev\USBTest\node_modules\usb\usb.js:261:5) …Run Code Online (Sandbox Code Playgroud) 这是一个更新和缩短的问题。
通过PyUSB与 USB 设备通信应该很容易。因此,我尝试在 Win10 下使用 PyUSB 从 USB 设备(示波器)读取数据。显然,自从找到设备以来,USB 驱动程序 (libusb-win32 v1.2.6.0) 已正确安装,并且我得到了一些响应print(dev)(见下文)。由此我可以看到输出端点地址是0x3,输入端点地址是0x81
根据示波器手册,我应该发送:SDSLSCPI#到设备以将其设置为 SCPI 模式,并且应该得到响应“:SCPION”。然而,当:SDSLSCPI#可再现地发送示波器的监视器时,它会冻结并且会重新启动。
如果我发送,*IDN?我应该得到回复,P1337,1842237,V2.4.0->。但前提是设备已处于 SCPI 模式。显然,事实并非如此,我收到超时错误(见下文)。
那么,我在这里做错了什么?我在PyUSB 教程中缺少哪些信息。我是否使用了错误的 PyUSB 命令/参数,或者是否缺少额外的驱动程序,或者是否与硬件(Win10 或设备硬件)有关?感谢您提供有关如何找出问题所在的提示。
顺便问一下, 中的第二个值是多少dev.read(0x81,7)?要读取的字节数?嗯,通常我不知道设备将发送多少字节。我期望在超时时间内读取一个命令,直到出现换行符或其他终止符。在哪里可以找到有关 PyUSB 的“万无一失”的文档、教程和示例?
代码:
import usb.core
import usb.util
dev = usb.core.find(idVendor=0x5345, idProduct=0x1234)
if dev is None:
raise ValueError('Device is not found')
# device is found :-)
print(dev)
dev.set_configuration()
msg = ':SDSLSCPI#'
print("Write:", msg, dev.write(3,msg)) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个与USB视频播放控制器交互的用户空间程序.我使用C++编程,该程序旨在在Linux上运行.在研究libusb手册时,我遇到了这个void libusb_exit ( struct libusb_context * ctx )功能.
描述说:
取消初始化libusb.
应在关闭所有打开的设备之后和应用程序终止之前调用.
手册没有解释为什么需要它.我对终止已经初始化并使用libusb而不调用的程序的后果感到好奇libusb_exit().如果由于某些原因我的程序libusb_exit()在终止之前无法调用,有人可以解释可能会发生什么坏事吗?它会导致系统资源泄漏吗?
好吧,我可能在做一些愚蠢的事情,但我无法让 libusb 让我终生将数据传输到我的设备。
代码:
#include <iostream>
#include <iomanip>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <libusb-1.0/libusb.h>
#define EP_DATA_IN 0x83
#define EP_DATA_OUT 0x02
#define DEVICE_CONFIGURATION 0
int main(int argc, char **argv)
{
int rc;
libusb_context *ctx = NULL;
libusb_device_handle *dev_handle;
int actual = 0;
unsigned char *data = new unsigned char[4];
data[0]='a';data[1]='b';data[2]='c';data[3]='d';
rc = libusb_init(&ctx);
if(rc < 0) {
std::cout << "Init Error " << rc << std::endl;
return 1;
}
libusb_set_debug(ctx, 6);
dev_handle = libusb_open_device_with_vid_pid(ctx, 0x03eb, …Run Code Online (Sandbox Code Playgroud) libusb ×10
usb ×5
c++ ×3
linux ×3
c ×2
libusb-1.0 ×2
android ×1
android-ndk ×1
c++14 ×1
compilation ×1
gcc ×1
javascript ×1
kernel ×1
linker ×1
linux-kernel ×1
node.js ×1
permissions ×1
python ×1
pyusb ×1