我一直在开发一些软件,该软件使用libusb-win32库与我一直在开发的某些USB硬件进行交互。现在,我试图在Windows 64上运行相同的软件,但驱动程序似乎无法正常工作(可以理解)。
我忽略了64位Windows的替代方案吗?
我正在编写用户空间程序,旨在通过usb控制某些设备,所以我决定使用libusb(libusb-1.0)向该设备发送控制消息并从该设备接收响应.
但我不断从我的代码中收到以下一堆错误(即使它是使用'sudo'执行的):
USB error: could not set config 0: Device or resource busy
set configuration: failed
Check that you have permissions to write to 007/012 and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly.
USB error: could not claim interface 0: Device or resource busy
claim interface: failed
USB error: error submitting URB: No such file or directory
bulk writing: failed
USB error: error submitting URB: No such file or directory
bulk reading: failed
response was:
Run Code Online (Sandbox Code Playgroud)
代码是:
usb_dev_handle* …Run Code Online (Sandbox Code Playgroud) 我修改了libusb1.0的open函数如下:
static int op_open2(struct libusb_device_handle *handle, int fd) {
struct linux_device_handle_priv *hpriv = _device_handle_priv(handle);
hpriv->fd = fd;
return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT);
}
Run Code Online (Sandbox Code Playgroud)
其中fd是通过android.hardware.usb.UsbDeviceConnection.html#getFileDescriptor()获得的
final UsbDeviceConnection connection = manager.openDevice(device);
return connection.getFileDescriptor();
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我打电话时,我不断收到错误
static int op_claim_interface(struct libusb_device_handle *handle, int iface)
{
int fd = _device_handle_priv(handle)->fd;
int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface);
if (r) {
if (errno == ENOENT)
return LIBUSB_ERROR_NOT_FOUND;
else if (errno == EBUSY)
return LIBUSB_ERROR_BUSY;
else if (errno == ENODEV)
return LIBUSB_ERROR_NO_DEVICE;
usbi_err(HANDLE_CTX(handle),
"claim interface failed, error %d errno …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用libusb的C示例,并且事情正常工作,直到我尝试执行以下操作:
libusb_device_descriptor descriptor;
int result = libusb_get_device_descriptor(usb_device, &descriptor);
Run Code Online (Sandbox Code Playgroud)
编译器告诉我,没有声明在同一个libusb.h头文件中定义的一些元素,以及我正在使用的其他libusb结构.WTH?
这是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
void printdev(libusb_device *usb_device);
/**
* main
*/
int main(void) {
puts("USB Test v0.0.1");
libusb_device **usb_devices;
libusb_context *usb_context = NULL;
int result;
result = libusb_init(&usb_context);
ssize_t device_count;
if (result < 0) {
puts("USB initialization error!");
return EXIT_FAILURE;
}
libusb_set_debug(usb_context, 1);
device_count = libusb_get_device_list(usb_context, &usb_devices);
if (device_count < 0) {
puts("Unable to get USB device list!");
return EXIT_FAILURE;
}
char message[24];
sprintf(message, …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取Trimble SPS-361 GPS接收器的输出,该接收器通过USB连接到Windows 7机器,使用C++(最好)或Java.我知道人们已经提出了类似的问题,但我似乎无法找到我正在寻找的东西.这听起来像libusb是我最好的选择,这是真的吗?如果是这样,什么是一个很好的教程/指南/示例代码?
听起来我需要安装/编写某种特定于设备的驱动程序然后我可以通过libusb用C++从设备读取数据.这是从USB读取的一般过程还是我困惑?
总结我认为需要的东西(我知道我到处都是):
libusb_open(device, &deviceHandle);
Run Code Online (Sandbox Code Playgroud)
返回0
但
libusb_bulk_transfer(deviceHandle, 0x81, data1, 512, &len, 0);
Run Code Online (Sandbox Code Playgroud)
返回-5
所以我尝试code -5使用发现错误printf
LIBUSB_ERROR_TIMEOUT
LIBUSB_ERROR_PIPE
LIBUSB_ERROR_OVERFLOW
LIBUSB_ERROR_NO_DEVICE
LIBUSB_ERROR_IO
LIBUSB_TRANSFER_ERROR
LIBUSB_ERROR_INTERRUPTED
LIBUSB_ERROR_ACCESS
LIBUSB_ERROR_BUSY
LIBUSB_ERROR_NO_MEM
LIBUSB_ERROR_COUNT
LIBUSB_ERROR_INVALID_PARAM
Run Code Online (Sandbox Code Playgroud)
但是没有...而且在Google中找不到任何地方...
error code -5in 是什么意思libusb_bulk_transfer?
帮我!
我想使用Iterator::find的libusb::Devices对象,它具有像这样的签名:
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where Self: Sized, P: FnMut(&Self::Item) -> bool
Run Code Online (Sandbox Code Playgroud)
我想找一个具有特定功能的设备vendor_id,这需要Device::device_descriptor在每个设备上调用.但是,该device_descriptor方法需要&mut每个设备一个,而find方法只给出一个&.
这是否意味着它不可能在任何的迭代器的方法(使用可变方法find,filter等等)?
这是我正在努力工作的例子:
let mut device = context
.devices()
.unwrap()
.iter()
.find(&mut |dev: &libusb::Device| {
dev.device_descriptor().unwrap().vendor_id() == vendor_id
})
.unwrap();
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
error: cannot borrow immutable borrowed content `*dev` as mutable
Run Code Online (Sandbox Code Playgroud) 我正在使用 libevent 编写一个事件驱动的应用程序,并且需要使用 libusb-1.0 进行 USB 传输。
我想使用libusb_get_pollfds获取文件描述符列表(在 中fds)并将它们添加到 libevent,如下所示:
const struct libusb_pollfd **fds = libusb_get_pollfds(device->context);
const struct libusb_pollfd *it = *fds;
for(;it != NULL; ++it) {
cout << "Adding fd: " << it->fd << ", " << it->events << endl;
struct event * ev = event_new(base_,
it->fd, it->events | EV_PERSIST,
callbacks::libusb_cb, this);
event_add(ev, 0);
libusb_fds_events.insert(std::make_pair(it->fd, ev));
}
free(fds);
// (...)
// And the callback function:
void callbacks::libusb_cb(evutil_socket_t fd, short what, void *arg) {
Server *s …Run Code Online (Sandbox Code Playgroud) PyUSB 1.0 声称现在支持等时传输(如果底层后端支持)。我已经弄清楚如何选择支持同步传输的libusb1.0后端,但我不确定如何实际实现读取和写入。我搜索过互联网,但找不到使用 PyUSB 的示例。帮助?
为 USB 鼠标编写一些 C 代码。
更具体地说,将配置和信息写入鼠标,如轮询、灵敏度、按钮操作、颜色(光)、触觉改变、OLED 等。
与开始了这个古老的文章,其中libhid建议了libusb。
看着libhid它似乎已经死了。该项目的最后一次提交是从 2012 年开始的,它是 C++。但我发现一些链接说应该转到hidapi.
然而,hidapi似乎也已经死了。2016 年的最后一次提交。或者它可能只是稳定的?
libusb毕竟,它看起来像一个更好的使用。从一篇 15 年前的文章开始 - 这并没有那么夸张。
问题是我是否遗漏了什么?是libusb要走的路吗?
已经做了一些快速测试 libusb-1.0.0-dev
#include <libusb-1.0/libusb.h>
Run Code Online (Sandbox Code Playgroud)
并且效果很好 - 至少对于我所做的快速测试而言是这样。但是 HID 库也许会更好?
从本机包选项我至少有:
libhidapi-dev
libhidapi-libusb0
libhidrd0-dbg
libhidapi-hidraw0
libhidrd0
libhidrd0-dev
Run Code Online (Sandbox Code Playgroud)
和
libusb-0.1-4 libusbmuxd4
libusb-1.0-0 libusbmuxd-dev
libusb-1.0-0-dev libusbmuxd-tools
libusb-1.0-doc libusb-ocaml
libusbauth-configparser1 libusb-ocaml-dev
libusbauth-configparser-dev libusbprog0v5
libusb-dev libusbprog-dev
libusbguard0 libusbredirhost1
libusbhid-common libusbredirhost-dev
libusb-java libusbredirparser1
libusb-java-dbg libusbredirparser-dev
libusb-java-doc libusbtc08-1
libusb-java-lib libusbtc08-dev
Run Code Online (Sandbox Code Playgroud)