macOS下如何查找串口的父USB设备?

2024-02-02

以下是我尝试枚举 Mac 上找到的所有串行端口,并遍历设备节点树以查找 USB 串行适配器的父 USB 设备的方法:

#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
#import <IOKit/serial/IOSerialKeys.h>
#import <IOKit/usb/IOUSBLib.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        CFMutableDictionaryRef keywordDict = IOServiceMatching(kIOSerialBSDServiceValue);
        io_object_t port = 0;
        io_iterator_t iterator = 0;
        kern_return_t result = IOServiceGetMatchingServices(kIOMasterPortDefault, keywordDict, &iterator);
        if (result)
        {
            NSLog(@"Failed to find any serial ports.");
            exit(EXIT_FAILURE);
        }

        while ((port = IOIteratorNext(iterator)))
        {
            @autoreleasepool
            {
                NSMutableArray<NSDictionary *> *array = [NSMutableArray array];
                CFMutableDictionaryRef dict = NULL;
                result = IORegistryEntryCreateCFProperties(port, &dict, kCFAllocatorDefault, 0);
                if (!result)
                    [array addObject:CFBridgingRelease(dict)];

                io_object_t parent = 0;
                io_object_t parents = port;
                while (IORegistryEntryGetParentEntry(parents, kIOServicePlane, &parent))
                {
                    result = IORegistryEntryCreateCFProperties(parent, &dict, kCFAllocatorDefault, 0);
                    if (!result)
                        [array addObject:CFBridgingRelease(dict)];

                    if (parents != port)
                        IOObjectRelease(parents);
                    parents = parent;
                }

                NSLog(@"0x%08lx = %@", (uintptr_t)port, array);
            }
        }
    }
    return 0;
}

然而,虽然这段代码可以找到所有串行端口(USB 串行适配器和我的 Hackintosh 上的超级 IO 端口),但遍历 IOService 树却不起作用。帮助?目标操作系统是 macOS 10.13.6。

Edit

以下是我的一个 USB 串行适配器的输出:

2018-08-18 19:05:39.860794+0800 lstty[98738:5197725] 0x00002a07 = (
        {
        CFBundleIdentifier = "com.apple.iokit.IOSerialFamily";
        IOCalloutDevice = "/dev/cu.usbmodem1751";
        IOClass = IOSerialBSDClient;
        IODialinDevice = "/dev/tty.usbmodem1751";
        IOGeneralInterest = "IOCommand is not serializable";
        IOMatchCategory = IODefaultMatchCategory;
        IOProbeScore = 1000;
        IOProviderClass = IOSerialStreamSync;
        IOResourceMatch = IOBSD;
        IOSerialBSDClientType = IOModemSerialStream;
        IOTTYBaseName = usbmodem;
        IOTTYDevice = usbmodem1751;
        IOTTYSuffix = 1751;
    }
)

这里是ioreg -itrc IOSerialBSDClient -w0同一设备的输出:

+-o Root  <class IORegistryEntry, id 0x100000100, retain 15>
  +-o iMac14,2  <class IORegistryEntry:IOService:IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (51894 ms), retain 45>
    +-o AppleACPIPlatformExpert  <class IORegistryEntry:IOService:IOPlatformExpert:IODTPlatformExpert:IOACPIPlatformExpert:AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (41509 ms), retain 50>
      +-o PCI0@0  <class IORegistryEntry:IOService:IOPlatformDevice:IOACPIPlatformDevice, id 0x10000013e, registered, matched, active, busy 0 (41377 ms), retain 54>
        +-o AppleACPIPCI  <class IORegistryEntry:IOService:IOPCIBridge:AppleACPIPCI, id 0x100000216, registered, matched, active, busy 0 (41332 ms), retain 31>
          +-o XHC@14  <class IORegistryEntry:IOService:IOPCIDevice, id 0x1000001f0, registered, matched, active, busy 0 (35582 ms), retain 11>
            +-o XHC@14000000  <class IORegistryEntry:IOService:AppleUSBHostController:AppleUSBXHCI:AppleUSBXHCIPCI:AppleUSBXHCILPT:AppleUSBXHCILPTH:AppleUSBXHCILPTHB, id 0x10000023d, registered, matched, active, busy 0 (35072 ms), retain 1249>
              +-o HS10@14a00000  <class IORegistryEntry:IOService:AppleUSBHostPort:AppleUSBXHCIPort:AppleUSB20XHCIPort, id 0x100000277, registered, matched, active, busy 0 (22180 ms), retain 17>
                +-o IOUSBHostDevice@14a00000  <class IORegistryEntry:IOService:IOUSBNub:IOUSBDevice, id 0x100007a40, registered, matched, active, busy 0 (1604 ms), retain 31>
                  +-o AppleUSB20Hub@14a00000  <class IORegistryEntry:IOService:AppleUSBHub:AppleUSB20Hub, id 0x100007a4e, registered, matched, active, busy 0 (1600 ms), retain 23>
                    +-o AppleUSB20HubPort@14a10000  <class IORegistryEntry:IOService:AppleUSBHostPort:AppleUSBHubPort:AppleUSB20HubPort, id 0x100007a52, registered, matched, active, busy 0 (964 ms), retain 17>
                      +-o IOUSBHostDevice@14a10000  <class IORegistryEntry:IOService:IOUSBNub:IOUSBDevice, id 0x1000082bb, registered, matched, active, busy 0 (323 ms), retain 32>
                        +-o AppleUSB20Hub@14a10000  <class IORegistryEntry:IOService:AppleUSBHub:AppleUSB20Hub, id 0x1000082d4, registered, matched, active, busy 0 (316 ms), retain 23>
                          +-o AppleUSB20HubPort@14a12000  <class IORegistryEntry:IOService:AppleUSBHostPort:AppleUSBHubPort:AppleUSB20HubPort, id 0x1000082d8, registered, matched, active, busy 0 (269 ms), retain 17>
                            +-o ComboDebug USB Serial@14a12000  <class IORegistryEntry:IOService:IOUSBNub:IOUSBDevice, id 0x10000837e, registered, matched, active, busy 0 (268 ms), retain 28>
                              +-o IOUSBHostInterface@1  <class IORegistryEntry:IOService:IOUSBNub:IOUSBInterface, id 0x100008390, registered, matched, active, busy 0 (259 ms), retain 8>
                                +-o AppleUSBACMData  <class IORegistryEntry:IOService:IOSerialDriverSync:AppleUSBACMData, id 0x1000083a0, registered, matched, active, busy 0 (1 ms), retain 6>
                                  +-o IOModemSerialStreamSync  <class IORegistryEntry:IOService:IOSerialStreamSync:IOModemSerialStreamSync, id 0x100008417, registered, matched, active, busy 0 (1 ms), retain 6>
                                    +-o IOSerialBSDClient  <class IORegistryEntry:IOService:IOSerialBSDClient, id 0x100008418, registered, matched, active, busy 0 (0 ms), retain 5>
                                        {
                                          "IOClass" = "IOSerialBSDClient"
                                          "CFBundleIdentifier" = "com.apple.iokit.IOSerialFamily"
                                          "IOProviderClass" = "IOSerialStreamSync"
                                          "IOTTYBaseName" = "usbmodem"
                                          "IOSerialBSDClientType" = "IOModemSerialStream"
                                          "IOProbeScore" = 1000
                                          "IOCalloutDevice" = "/dev/cu.usbmodem1751"
                                          "IODialinDevice" = "/dev/tty.usbmodem1751"
                                          "IOMatchCategory" = "IODefaultMatchCategory"
                                          "IOTTYDevice" = "usbmodem1751"
                                          "IOResourceMatch" = "IOBSD"
                                          "IOGeneralInterest" = "IOCommand is not serializable"
                                          "IOTTYSuffix" = "1751"
                                        }

提前终止的问题是循环的退出条件:

     while (IORegistryEntryGetParentEntry(parents, kIOServicePlane, &parent))

IORegistryEntryGetParentEntry()返回一个kern_return_t - KERN_SUCCESS是 0,所以这意味着while条件评估为 false 并且循环永远不会运行。尝试

     while (KERN_SUCCESS == IORegistryEntryGetParentEntry(parents, kIOServicePlane, &parent))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

macOS下如何查找串口的父USB设备? 的相关文章

  • XCode 4.2 编译器错误

    当我使用 XCode 4 2 创建新项目 例如 单视图 iOS 应用程序 时 支持文件 文件夹中的 main m 文件如下所示 import
  • 我可以在 iOS 中测量蓝牙信号强度吗?

    Can I 测量信号强度我的 iPhone 范围内的蓝牙设备数量 基本上我想要做的是扫描范围内的设备列表 然后查看哪个设备的信号强度最高 在 iOS 中是否可行 如果可以 我该怎么做 是的 有一种方法可以测量蓝牙低功耗 4 0 的信号强度
  • 如何对其中包含自定义对象的 NSMutableArray 进行排序?

    我想做的事情看起来很简单 但我在网上找不到任何答案 我有一个NSMutableArray对象 假设它们是 Person 对象 我想排序NSMutableArray通过 Person birthDate 这是一个NSDate 我认为这与这个方
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 如何将二进制文件的内容嵌入到 Mac OS X 上的可执行文件中?

    我的命令行程序的构建过程生成一个二进制文件 超过 500KB 当前必须通过 argv 的路径引用该文件 我想将此文件嵌入到可执行文件中 在 Linux 上 它看来有可能 http www linuxjournal com content e
  • 如何在java中访问USB端口[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试编写一个java应用程序来访问USB端口以读取和写入通过USB连接的设备 我面临的问题是我不
  • Xamarin 没有安装的配置文件与安装的 iOS 签名身份匹配

    我想知道是否可以在 ios 设备上编译 Xamarin 应用程序 使用 Visual Studio for mac 而无需成为开发人员 费用为 99 美元 年 因为当我尝试在 iPhone 上构建项目时出现此错误 Xamarin iOS C
  • 主队列上的dispatch_sync 与dispatch_async

    请耐心等待 这需要一些解释 我有一个类似于下面的函数 上下文 aProject 是一个名为 LPProject 的核心数据实体 其数组名为 memberFiles 其中包含另一个名为 LPFile 的核心数据实体的实例 每个 LPFile
  • 如何在 iPhone 应用程序中播放来自服务器的视频 URL

    实际上 我通过使用从服务器获取一个网址XMLParser 我想在我的应用程序中播放这个视频网址 现在我使用了 MPMoviePlayerController 但它不起作用 请帮忙 XML解析器 m id loadXMLByURL NSStr
  • Docker OSX:从容器连接到主机端口

    我的问题 我正在尝试在 docker 容器上安装 Flask 应用程序 该应用程序需要通过以下方式安装一些软件包pip https pip pypa io en stable 我在端口 9000 上使用本地 主机 而不是容器 pip 存储库
  • 10.11 NSCollectionView - 动态确定单元格大小

    OS X v10 11 AppKit 发行说明 https developer apple com library mac releasenotes AppKit RN AppKit 10 11CollectionView建议可以根据每个项
  • 在 UITableView 中创建隐藏的 UISegmentedControl

    与 iBooks 应用程序一样 当您下拉表格视图时 会出现搜索栏和分段控件 以允许您在两种类型的视图之间搜索和切换 当您向下拉得足够远时 它会停留在该位置 或者当您将桌面视图拉得足够远时 它会被隐藏 我正在尝试用一个来实现同样的事情UISe
  • 以编程方式显示 UIView

    我试图 通过动画 显示 UIView 具体来说 我想显示视图的中心部分 然后慢慢地显示它的外边缘 有点像拉开窗帘 我的第一次尝试是简单地将边界矩形设置得更小 并将其动画化为视图框架的完整大小 但这没有达到预期的效果 因为通过更改边界 我也更
  • 错误:“消息回复时间太长”向设备手表套件 OS 2 发送消息

    从 Apple Watch 向设备发送消息时出现以下错误 错误域 WCErrorDomain代码 7012 消息回复时间太长 UserInfo NSLocalizedDescription 消息回复时间太长 NSLocalizedFailu
  • MacTypes.h 中 UInt32 的 Typedef 重新定义,来自 CFBase.h 中的定义

    我在 MacTypes h 的以下代码块中的两行中收到 typedef 重新定义错误 if LP64 typedef unsigned int UInt32 typedef signed int SInt32 else typedef un
  • 为什么我的 x 轴在 iPhone 上不显示核心图?

    编辑 我认为我的问题更好地表述为 我怎样才能有一个不从零开始的 Y 轴 看起来 x 轴总是放置在 y 0 处 但我希望 x 轴位于 y 轴上的某个正数 这是一张包含更多常规数据的图表 我只是希望将 x 轴放置在绘图的最小 y 值 大约 77
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • iOS 上读取证书问题

    我正在尝试从 iOS 中的各种 URL 读取证书 然而 我的代码运行不佳 应该返回我需要的信息的数组总是返回null 我缺少什么 void findCertificate NSString url NSInputStream input N
  • 如何将媒体附件添加到 iOS 10 应用程序中的推送通知中?

    有多个示例 您应该如何设置项目来添加使用 媒体附件 技术来显示图像的丰富通知 我已经阅读了其中的大部分内容 但我错过了一些内容 因为我的项目没有使用此有效负载显示任何丰富的通知 使用 APNS Tool 和 Boodle 进行测试 aps
  • 如何使用 AutoLayout 使 UIView 向上滑动动画?

    this is what I like to achieve 我想执行向上滑动动画 用户可以向上滑动 UIView2 并且 UIView2 将在屏幕上停止一半 我知道如何通过 UIButton 操作以模态方式呈现 UIViewControl

随机推荐