2011-05-16 170 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