【问题标题】:Searching Serial Ports with IOKit - Swift使用 IOKit 搜索串行端口 - Swift
【发布时间】:2014-10-08 19:44:54
【问题描述】:

我正在尝试了解 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'"

这是什么意思?

【问题讨论】:

    标签: macos swift serial-port iokit


    【解决方案1】:

    其中发生了一些不同的问题 - 让我们首先解决您的导入问题。看起来你需要这两个:

    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 声明。有很多有用的 cmets,您将能够看到哪些参数和返回值是非托管的或指针(因为我认为这个框架的官方文档还没有更新)。

    【讨论】:

    • 非常感谢您花时间写这篇文章,这确实提供了丰富的信息!我已经实现了所有建议的段,这些段没有导致语法错误(这总是让我兴奋)并且我一直在尝试运行它。该程序构建并运行,但是我收到错误:“EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)”。我读过这可能是由于指针的滥用造成的,这可能吗?该错误标记了我的 refreshSerialList() 函数的右括号,这不太可能是问题本身。指针可能会导致这个问题吗?
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2020-10-10
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多