为什么 ORSSerialPort 接收委托在我的 Swift 项目中不起作用



我有一个简单的串行控制器类:

class SerialController : NSObject, ORSSerialPortDelegate {
    var port : ORSSerialPort
    init(path: String){
        port=ORSSerialPort(path: path)
        port.close()
    }
    func open(){
        port.baudRate=9600
        port.delegate=self
        port.open()
    }
    func close(){
        port.delegate=nil
        port.close()
    }
    func SendString(data: String){
        port.sendData(data.dataUsingEncoding(NSUTF8StringEncoding))
    }
    func serialPortWasOpened(serialPort: ORSSerialPort!) {
        println("PORT IS OPEN....")
    }
    func serialPortWasClosed(serialPort: ORSSerialPort!) {
        println("PORT IS CLOSE")
    }
    func serialPort(serialPort: ORSSerialPort!, didReceiveData data: NSData!) {
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }
    func serialPortWasRemovedFromSystem(serialPort: ORSSerialPort!) {
        println("PORT REMOVED")
    }
    func serialPort(serialPort: ORSSerialPort!, didEncounterError error: NSError!) {
        println("PORT ERR (error)")
    }
}

以及用于将数据发送到FT232适配器的简单代码

func readLine()->String{
    return NSString(data:NSFileHandle.fileHandleWithStandardInput().availableData, encoding: NSUTF8StringEncoding)
}
let myPort = SerialController(path: "/dev/cu.usbserial-CN920229")
myPort.open()
println("type your data to send...")
let k = readLine()
myPort.SendString(k)
myPort.close()

FT232的RX和TX引脚连接在一起,我想接收数据的回声。我可以连接到我的适配器和 SendString 方法正确地将数据发送到 FT232,但接收不起作用!在cocoaDemo中,我测试了我的FT232,我可以得到正确的响应。我能做什么?

根本问题是你立即关闭端口,程序在端口上发送数据后结束。您需要保持程序运行和端口打开以接收数据。最简单的方法是在发送数据后旋转运行循环:

func readLine()->String?{
    return NSString(data:NSFileHandle.fileHandleWithStandardInput().availableData, encoding: NSUTF8StringEncoding)
}
let myPort = SerialController(path: "/dev/cu.USA19H141P1.1")
myPort.open()
println("type your data to send...")
if let k = readLine() {
    myPort.SendString(k)
}
NSRunLoop.currentRunLoop().run() // <-- This will continue indefinitely.

请注意,虽然这将允许您接收数据,但它当然不是一个结构良好的程序。每次运行程序只能发送一个字符串,因为您只调用 readLine () 一次,而不是循环并重复调用它。除了用 ⌘- 杀死它之外,也没有办法退出程序。或类似。

如果您打算将其转换为一个真正的程序,而不仅仅是用于快速的一次性测试,我建议您查看ORSSerialPort的示例文件夹中的CommandLineDemo项目。该示例在 Swift 和 Objective-C 中都有可用的版本。

最新更新