【问题标题】:Incompatible pointer error when trying to get a HID device reference from HID manager on Mac尝试从 Mac 上的 HID 管理器获取 HID 设备引用时出现不兼容的指针错误
【发布时间】:2019-06-21 19:47:08
【问题描述】:

我正在尝试编写用户空间设备驱动程序以从自定义 HID 设备中提取一些数据。我将执行以下操作以将 HID 管理中的设备引用存储到变量中。

CFSetRef device = IOHIDManagerCopyDevices(HIDManager);

在此之后,我执行以下操作来注册我的回调,该回调正在设置从设备读取的报告(我正在努力解决的另一个领域。)

IOHIDDeviceRegisterInputReportCallback(device, report, ReadDailyDataResonposeSize, Handle_IOHIDDeviceIOHIDReportCallback, NULL);

我在上述函数中对“设备”的引用出现错误,说“传递 CFSetRef 的指针类型不兼容”

如果我在创建设备时尝试更改设备的类型,尽管我得到另一个说它需要是 CFSetRef。所以我有点困惑,任何人有任何建议。我对 C 非常陌生,并且在 Mac 上工作。到目前为止,文档对我来说非常简洁。

编辑:这是我的其余代码的链接以供参考。 http://pastebin.com/rFsHisdh

【问题讨论】:

  • 您提供的信息不完整,我们无法理解问题所在。请提供更多详细信息/代码。
  • @ajay 抱歉,继续并包括其余部分。

标签: objective-c c macos hid


【解决方案1】:

这是IOHIDDeviceRegisterInputReportCallback函数根据documentation的签名:

CF_EXPORT void IOHIDDeviceRegisterInputReportCallback(
    IOHIDDeviceRef device,
    uint8_t *report,
    CFIndex reportLength,
    IOHIDReportCallback callback,
    void *context) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER;

如您所见,第一个参数应该是 IOHIDDeviceRef,而您传入​​的是 CFSetRefprovide[s] support for the mathematical concept of a set 正如 Martin R 的回答所表明的那样。

要获取集合的元素并传递设备(如果有),您应该执行以下操作:

CFSetRef devices = IOHIDManagerCopyDevices(HIDManager);
CFIndex size = CFSetGetCount(devices);
if(size > 0) {
    CFTypeRef array[size]; // array of IOHIDDeviceRef
    CFSetGetValues(devices, array);
    IOHIDDeviceRegisterInputReportCallback((IOHIDDeviceRef)array[0], report, ReadDailyDataResonposeSize, Handle_IOHIDDeviceIOHIDReportCallback, NULL);
}

希望对你有帮助。

【讨论】:

  • 您是否碰巧知道任何其他文档、博客文章、示例等...展示了向 HID 发送和接收报告以便从中读取数据,而不仅仅是苹果文档? Apple 似乎没有详细说明如何从非某种输入设备发送和接收报告。
  • @Stavros_S 不,抱歉。我唯一找到的是SFML 开源库,它有一些代码可以通过其HIDInputManager 类与输入设备进行交互。也许你可以从中得到一些想法。
【解决方案2】:

IOHIDManagerCopyDevices() 返回IOHIDDeviceRef 元素的集合。 您必须从集合中获取一个元素并将其传递给 IOHIDDeviceRegisterInputReportCallback().

【讨论】:

  • 我明白了,即使 HID 管理器只匹配一台设备,因为我在匹配的字典中使用了产品 ID,是否也是这种情况?
  • @Stavros_S 函数IOHIDManagerCopyDevices 返回一个集合,即使它是一个包含单个元素的集合。
【解决方案3】:

我遇到了这个问题。您从不再正确的 Apple 文档 (https://developer.apple.com/library/archive/technotes/tn2187/_index.html) 粘贴。您的报告变量以错误的格式分配,导致运行时出现内存错误。执行以下操作:

uint8_t *report = (uint8_t *)malloc(reportSize);
IOHIDDeviceRegisterInputReportCallback(device, report, ReadDailyDataResonposeSize, Handle_IOHIDDeviceIOHIDReportCallback, NULL);```

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2013-04-05
    • 2014-01-20
    • 1970-01-01
    • 2016-10-28
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多