我有一个由 PNI Corp 开发的传感器,称为 spacepoint-fusion。我需要用 C++ 与该设备交互并不断从设备读取新数据。
当我将设备插入计算机时,我看到 /dev/hidraw1 和 /dev/hidraw2 出现。 /dev/usb/hiddev0 也会出现。
我的问题是我不知道如何读取这些设备。我在网上找不到任何示例或文档。我什至不知道从哪里开始。我一直在寻找 libhid 和 hiddev 作为可能的解决方案,但到目前为止,我还不知道如何使用这两个库。
那么我如何在 Linux 机器上用 C++ 读取这个人机界面设备呢?示例将不胜感激。 谢谢。
尝试在 hidraw 设备上运行 hexdump 并在“spacepoint-fusion”上创建一些输入。
$ hexdump -C /dev/hidraw1
如果您获得一些有用的数据,那么最简单的方法是使用
open()
和 read()
从设备获取输入。每个 read()
应从您的设备返回一包信息。您需要一些设备文档,或者准备好对数据包的含义进行逆向工程。
你前面有一条复杂的路。您首先需要有关“spacepoint-fusion”的信息(希望它附带文档)。
一些初始值如Product ID/Vendor ID可以通过终端命令获取:
lsusb
接下来,您可能需要知道端点,可以使用以下方法再次找到端点:
lsusb -v
从中,您可以找到设备上的哪些地址可以写入,以及可以从哪些地址读取(以及可能的读/写缓冲区的大小)。但这是您在没有适当文件的情况下所能得到的。您需要知道要写入设备的值以及期望从设备返回的值。
假设您确实知道要从设备读取/写入哪些值,请尝试遵循以下示例:
https://web.archive.org/web/20130902234909/http://www.lvr.com/code/generic_hid.c
我还假设您的设备符合 HID 标准,但事实并非如此。不管怎样,祝您 USB 之旅一切顺利。
您应该使用libusb库:http://libusb.sourceforge.net/doc/index.html
#include <libusb.h>
另一种方法是使用读、写系统调用将 /dev/usb/hiddev0 作为简单文件读取。 请参阅:man 打开,man 2 读取,man 2 写入。
#include <fcntl.h>
#include <unistd.h>