使用IOKit搜索串行端口 - Swift

时间:2014-08-15 01:55:38

标签: macos swift serial-port iokit

我正在尝试了解IOKit以及它如何允许我在Swift程序中访问串口。

我现在操作的课程如下:

import Foundation

import Cocoa

import IOKit.serial.IOSerialKeys



class Serial {

    init() {
    }

    @IBOutlet var serialListPullDown : NSPopUpButton!

    func refreshSerialList(defaultprompt: String) {


        // remove everything from the pull down list
        serialListPullDown?.removeAllItems()

        // ask for all the serial ports
        IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching(kIOSerialBSDServiceValue), io_iterator_t)

    }
}

基于我读过的内容,我认为我已经正确设置了IOServiceMatchingServices,但是我遇到了一些错误,例如“类型名称后的预期成员名称或构造函数调用”和“'o_iterator_t.Type'无法转换为' UnsafeMutualPointer'“

这是什么意思?

1 个答案:

答案 0 :(得分:2)

在那里发生了一些不同的问题 - 让我们先让你的进口平方。看起来你需要这两个:

import IOKit
import IOKit.serial

对于参数,如果我们将它们定义为局部变量,它将更容易看到我们正在使用的内容,如下所示:

// this one's easy, just grabbing a constant from IOKit.serial
let masterPort: mach_port_t = kIOMasterPortDefault
// here we get back an Unmanaged<CFMutableDictionary> and need to convert it to
// a CFDictionary using takeRetainedValue()
let classesToMatch: CFDictionary = IOServiceMatching(kIOSerialBSDServiceValue).takeRetainedValue()
// the iterator that will contain the results of IOServiceGetMatchingServices
var matchingServices: io_iterator_t = 0

最后,你称之为方法:

// note that the last parameter is an UnsafeMutablePointer<io_iterator_t>
// so we need to prefix matchingServices with an ampersand (&)
let kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, &matchingServices)
if kernResult == KERN_SUCCESS {
    // success
} else {
    // error
}

这感觉非常接近Swift现在可以处理的边缘 - 在进一步说明之前,请务必阅读这两页:

最后,请确保您可以进入IOKit框架的转换后的Swift声明。有很多有用的注释,你可以看到哪些参数和返回值是不受管理的或指针(因为我不认为这个框架的官方文档已经更新)。 / p>