使用 IOKit 与 USB 设备通信
Using IOKit to communicate with USB device
我正在尝试制作一个与 USB 设备通信的应用程序,其方式与我在终端上使用 screen
命令的方式大致相同。
为了让我的问题更容易理解,这是我通常在终端中做的事情:
命令:
ls /dev/tty.usb*
returns :
/dev/tty.usbmodem1411 /dev/tty.usbmodem1451
接下来,我调用:
screen /dev/tty.usbmodem1411
在此之后,我可以向设备发送命令(例如输入 'U',得到响应)
我正在尝试从 Xcode 开始执行此操作。
使用 IOKit,我成功地执行了等同于 returns USB 端口列表的第一个命令的命令:
/dev/tty.usbmodem1411 /dev/tty.usbmodem1451
这是代码:
@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;
}
}
现在,即使阅读了 Apple 的 IOKit 手册,我也无法前进。
如何开始使用 IOKit 发送命令?
查看 Apple Performing Serial I/O 示例项目。
我正在尝试制作一个与 USB 设备通信的应用程序,其方式与我在终端上使用 screen
命令的方式大致相同。
为了让我的问题更容易理解,这是我通常在终端中做的事情:
命令:
ls /dev/tty.usb*
returns :
/dev/tty.usbmodem1411 /dev/tty.usbmodem1451
接下来,我调用:
screen /dev/tty.usbmodem1411
在此之后,我可以向设备发送命令(例如输入 'U',得到响应)
我正在尝试从 Xcode 开始执行此操作。
使用 IOKit,我成功地执行了等同于 returns USB 端口列表的第一个命令的命令:
/dev/tty.usbmodem1411 /dev/tty.usbmodem1451
这是代码:
@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;
}
}
现在,即使阅读了 Apple 的 IOKit 手册,我也无法前进。 如何开始使用 IOKit 发送命令?
查看 Apple Performing Serial I/O 示例项目。