【问题标题】:Why ORSSerialPort receive delegate don't work in my Swift project为什么 ORSSerialPort 接收委托在我的 Swift 项目中不起作用
【发布时间】:2014-11-21 12:45:48
【问题描述】:

我有一个简单的 SerialController 类:

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,我可以得到正确的响应。 我该怎么办?

【问题讨论】:

  • 上面的代码真的可以编译吗?如果我在我的代码中使用完全相同的类串行控制器:我得到一个“未解包的可选类型'ORSSerialPort'的值;你的意思是在port=ORSSerialPort(path: path)行上使用!还是??如果我使用!它会编译但然后在同一行上获得运行时异常?我正在使用最新的 Xcode 和 swift 2.x?

标签: macos swift xcode6 orsserialport


【解决方案1】:

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

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 中都有可用的版本。

【讨论】:

  • 感谢安德鲁!我在一个带有 GUI 的新项目中测试这个类,现在我可以从端口接收数据 :) ;)
  • 很高兴听到这个消息!在 GUI 应用程序中,事情变得更容易,因为运行循环已为您设置并运行。
  • @AndrewMadsen - 你能看到我上面的评论吗?我无法使用最新的 Xcode 和 Swift 2.x 在我的项目中编译或运行上面完全相同的类?
  • @NealDavis,这段代码有些陈旧,自从发布以来,ORSerialPort 已经被注释为可空性和泛型注释,以便更好地连接到 Swift。 ORSSerialPort.init(path:) 初始化器返回一个可选的,因为路径可能指向也可能不指向有效的串行设备。您需要以一种或另一种方式打开该可选选项。正确的方法是使用例如if let port = ORSSerialPort(path: "/dev/cu.USA19H141P1.1") { // use the port }。你也可以用!强制打开它,虽然我不推荐它。
猜你喜欢
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多