gpt4 book ai didi

macos - 使用 IOKit 获取 USB 设备的 BSD 名称以写入设备?

转载 作者:行者123 更新时间:2023-12-04 12:48:27 25 4
gpt4 key购买 nike

我正在尝试在 MacOS 下使用 IOKit 确定虚拟串口的 BSD 名称。

我有一个看起来像虚拟串行端口的 USB CDC 设备,我想获取 BSD 设备路径,以便我可以执行 fopen("/dev/tty.usbmodem123")。我有一个程序,它接受 VID 和 PID 并等待设备插入,然后我想使用 BSD 名称写入设备。该设备在每个系统上的安装方式不同,我试图将其用作教学工具,因此我需要在写入之前搜索该设备,而无需手动检查/dev/tty.* 以了解设备的安装位置。

我有3个问题。

首先,可以使用CFSTR(kIOBSDNameKey)来获取虚拟串口的BSD名称吗? ?IORegistryEntrySearchCFProperty()FindProp()总是返回“空”。有谁知道非块设备是否可以返回 BSD 名称?
我目前正在这样做:
bsdName = IORegistryEntrySearchCFProperty(p_usb_ref, kIOServicePlane, CFSTR(kIOBSDNameKey), kCFAllocatorDefault, kIORegistryIterateRecursively );
其次,我已经能够获得服务平面名称:
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/OHC1@4/AppleUSBOHCI/Intro to Electronics@4100000
这对应于一个挂载点:/dev/tty.usbmodem411
有谁知道如何将服务平面名称转换为开发树名称?

第三,我是否让这太复杂了?我已经知道设备 io 句柄,有没有办法使用它向设备写入数据?我只需要发送几个 ASCII 字节来使一些 LED 闪烁。

任何建议将不胜感激。
EDIT:
花了一些时间查看这个之后,我发现我的问题是我在加载 CDC 驱动程序之前查询了 ​​BSD 名称。我目前正在获取 BSD 名称,然后整理出 VID 和 PID。

上面解决了我的问题的代码是:

matchingDictionary = IOServiceMatching(kIOSerialBSDServiceValue);
CFDictionarySetValue(matchingDictionary, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType));
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &iter);

然后你遍历 iter找到具有正确 ID 的设备。

最佳答案

这是我在添加 USB 串行设备时与 IONotification 一起使用的内容:
在 10.11 下,它是空的。在尝试了很多事情之后,这是我的解决方案:

while ((usbDevice = IOIteratorNext(iterator)))
{
//when hotplugging under OSX 10.11:
sleep(1);//otherwise the property will be empty.

CFStringRef deviceBSDName_cf = (CFStringRef) IORegistryEntrySearchCFProperty (usbDevice,
kIOServicePlane,
CFSTR (kIOCalloutDeviceKey),
kCFAllocatorDefault,
kIORegistryIterateRecursively );

NSLog(@"device path: %@", deviceBSDName_cf);

}

它应该找到类似:/dev/cu.xxxxx
希望它可以帮助某人。

关于macos - 使用 IOKit 获取 USB 设备的 BSD 名称以写入设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com