2014-11-21 85 views
3

我有一個簡單SerialController類:爲什麼ORSSerialPort接受委託不要在我的雨燕項目工作

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,我可以得到正確的迴應。 我能做什麼?

+0

上面的代碼是否真的編譯?如果我在我的代碼中使用完全相同的Class串行控制器:我得到一個「可選類型'ORSSerialPort'的值沒有解開;你的意思是使用!或者'port = ORSSerialPort(path:path)'if我使用!它會編譯,但然後在同一行上得到一個運行時異常?我使用最新的Xcode與swift 2.x? – 2016-02-22 02:11:10

回答

3

最根本的問題是您立即關閉端口,程序在端口上發送數據後結束。您需要保持程序運行並打開端口以接收數據。要做到這一點最簡單的方法是隻旋轉運行循環發送數據後:

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的Examples文件夾中的CommandLineDemo項目。 Swift和Objective-C都提供了這個示例的版本。

+1

謝謝安德魯!我用GUI測試這個類的新項目,現在我可以接收數據從端口:);) – 2014-11-23 10:26:33

+2

很高興聽到它!在一個GUI應用程序,事情更容易,因爲運行循環設置和運行。 – 2014-11-24 18:47:38

+0

@AndrewMadsen - 你能看到我上面的評論我無法編譯或運行在我的項目中使用最新的Xcode和Swift 2.x完全相同的類? – 2016-02-22 02:38:15

相關問題