Почему ORSSerialPort получает делегат не работает в моем проекте Swift

У меня есть простой класс 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()

Контакты RX и TX FT232 соединены вместе, и я хочу получить эхо данных. Я могу подключиться к своему адаптеру, и метод SendString правильно отправляет данные на FT232, но прием не работает!. в какао-демо я тестирую свой FT232 и могу получить правильный ответ. Что я могу сделать?

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 () один раз вместо зацикливания и повторного вызова. Также нет способа выйти из программы, если не убить ее с помощью ⌘-. или похожие.

Если вы планируете превратить это в настоящую программу, которую вы используете для чего-то большего, чем просто однократный тест, я бы посоветовал взглянуть на проект CommandLineDemo в папке Примеры ORSSerialPort. Существуют версии этого примера, доступные как в Swift, так и в Objective-C.

Другие вопросы по тегам