2011-05-16 168 views
0

通常在終端中,我會執行此命令與串行USB設備進行通信。NsTask執行終端命令的問題

回聲-e「\ XFF \ X01 \ X01」> /dev/cu.usbserial-A8003YzT

我試圖使用NStask可可應用程序中做到這一點,但我沒有得到愛因爲某些原因。

繼承人我的代碼:

- (IBAction) doCommand:(id)sender{ 
{ 
    NSTask *task; 
    task = [[NSTask alloc] init]; 

    [task setLaunchPath:@"/bin/echo"]; 

    [task setArguments: 
[NSArray arrayWithObjects:@"-e '\\xFF\\x01\\x01' > /dev/cu.usbserial-A8003YzT", nil]]; 


    [task launch]; 

    [task release]; 
}} 

我知道代碼基本上是工作,因爲我用同樣的腳本執行的其他終端命令.....不知道爲什麼我不能得到迴音開火....也許我錯過了簡單的東西?

感謝所有幫助

回答

1

您正在嘗試發送'\xFF\x01\x01' > /dev/cu.usbserial-A8003YzT作爲第一個參數echo,但是這不是當你從一個shell提示符下運行該命令會發生什麼。只有第一個被引用的部分被作爲參數發送給echo。 Bash解釋>本身,捕獲echo命令的輸出,並將其重定向到指定的文件 - 在這種情況下,是一個代表USB設備的文件。

如果你想運行一個NSTask,將解釋與重定向,管道,這樣,你就需要使用/bin/sh作爲啓動路徑,和-cyour shell command作爲參數shell命令。

或者,您可以完全跳過NSTask,只需打開設備文件的NSFileHandle,然後發送要發送它的三字節序列。回聲是方便的互動調試這樣在終端的東西,但在你的應用程序中啓動一個外部任務,只是寫三個字節的文件,是非常激烈的矯枉過正... :-)

+0

+1「或者。 ..「根據我的經驗,需要啓動shell的NSTasks是一個**糟糕的想法。首先,他們打破了NSLog的其餘程序執行。 – Richard 2011-05-16 15:32:51

+0

@Sherm ....是的,照顧了這個問題。現在工作。我確信我不瞭解正確運行命令的正確功能。謝謝你清理那個。我對Obj-c相當陌生,所以我會給NSFileHandle一看。聽起來這是一個更好的方法,只是不知道現在怎麼樣.... @理查德,謝謝你的提高,我讀過同樣的東西,並將NSfilehandle看作一個更好的選擇謝謝大家! – butteryak 2011-05-16 16:36:37