使用IOKit与USB设备通信

kmn*_*kmn 6 macos cocoa serial-port iokit swift

我正在尝试制作一个与 USB 设备通信的应用程序,其方式与我screen在终端上使用该命令的方式相同。

为了让我的问题更容易理解,这就是我通常在终端中所做的:

命令 :

ls /dev/tty.usb*
Run Code Online (Sandbox Code Playgroud)

返回:

/dev/tty.usbmodem1411   /dev/tty.usbmodem1451
Run Code Online (Sandbox Code Playgroud)

接下来,我打电话:

screen /dev/tty.usbmodem1411
Run Code Online (Sandbox Code Playgroud)

在此之后,我可以向设备发送命令(例如输入“U”,获得响应)

我现在正在尝试从 Xcode 执行此操作。

使用 IOKit,我设法执行了相当于第一个返回 USB 端口列表的命令:

/dev/tty.usbmodem1411   /dev/tty.usbmodem1451
Run Code Online (Sandbox Code Playgroud)

这是代码:

@IBAction func testPressed(sender: AnyObject) {

        var portIterator: io_iterator_t = 0
        let kernResult = findSerialDevices(kIOSerialBSDModemType, serialPortIterator: &portIterator)
        if kernResult == KERN_SUCCESS {
            printSerialPaths(portIterator)
        }

    }

    func findSerialDevices(deviceType: String, inout serialPortIterator: io_iterator_t ) -> kern_return_t {
        var result: kern_return_t = KERN_FAILURE
        var classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue).takeUnretainedValue()
        var classesToMatchDict = (classesToMatch as NSDictionary) as Dictionary<String, AnyObject>
        classesToMatchDict[kIOSerialBSDTypeKey] = deviceType
        let classesToMatchCFDictRef = (classesToMatchDict as NSDictionary) as CFDictionaryRef
        result = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatchCFDictRef, &serialPortIterator);
        return result
    }

    func printSerialPaths(portIterator: io_iterator_t) {
        var serialService: io_object_t
        do {
            serialService = IOIteratorNext(portIterator)
            if (serialService != 0) {
                let key: CFString! = "IOCalloutDevice"
                let bsdPathAsCFtring: AnyObject? = IORegistryEntryCreateCFProperty(serialService, key, kCFAllocatorDefault, 0).takeUnretainedValue()
                var bsdPath = bsdPathAsCFtring as String?
                if let path = bsdPath {
                    println(path)
                }
            }
        } while serialService != 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,即使阅读了 Apple 的 IOKit 手册,我也无法前进。如何开始使用 IOKit 发送命令?

geo*_*war -3

请参阅 Apple Performing Serial I/O示例项目。

  • 您好,感谢您的链接。我正在寻找一种方法来快速做到这一点。这是 C 语言。我感谢你的帮助。 (2认同)