我正在尝试创建一个与USB设备通信的应用程序,就像我在终端上使用screen命令一样。
为了让我的问题更容易理解,我通常在终端中这样做:
命令:
ls /dev/tty.usb*返回:
/dev/tty.usbmodem1411 /dev/tty.usbmodem1451接下来,我调用:
screen /dev/tty.usbmodem1411在此之后,我可以向设备发送命令(例如,输入'U‘,获取响应)
我现在正尝试在Xcode中这样做。
使用IOKit,我成功地执行了相当于第一个返回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;
}
}现在,即使在读完苹果的IOKit手册后,我仍然无法继续前进。如何开始使用IOKit发送命令?
发布于 2015-02-05 05:12:55
请参阅苹果Performing Serial I/O示例项目。
https://stackoverflow.com/questions/28300416
复制相似问题