簡體   English   中英

使用IOKit搜索串行端口-Swift

[英]Searching Serial Ports with IOKit - Swift

我試圖了解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”

這是什么意思?

那里發生了一些不同的問題-讓我們先解決進口問題。 看來您需要以下兩個條件:

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聲明。 有很多有用的注釋,您將能夠看到哪些參數和返回值是非托管的或指針(因為我認為該框架的官方文檔尚未更新)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM