所以我通过使用echo发送和cat接收来与设备通信。这是我的代码片段:
\n
好的,问题是,cat似乎保持打开状态,因为当我在循环中运行此代码时,它第一次运行,然后挂在我称之为popen的位置。假设猫是罪魁祸首我是否正确?
有没有办法在我运行命令后立即终止cat,所以我只是从我的设备获得响应?谢谢!
答案 0 :(得分:2)
在命令中:
echo "xyz" > /dev/ttyACM0 | cat - /dev/ttyACM0
TTY设备通常在载波存在或CLOCAL设置之前不会打开。猫可能在等待开放。假设设备打开,那么猫将等待读取字符,直到(1)它收到一个EOF字符,如control-D,或(2)载体丢失或(3)你杀了它。
这里的另一个问题是echo和cat之间的管道会立即关闭,因为echo的输出被重定向到同一个TTY设备,重定向会关闭管道。
一般来说,TTY设备是野兽,需要特殊处理才能使逻辑正确。可能你最好阅读TTY设备,特别是:
man termios
如果你正在做一些非常简单的事情,你可能会接受:
fp = popen("echo 'xyz' >/dev/ttyACM0 & (read x; echo \"$x\")");
请记住,echo和read都可能会挂起等待运营商,并且你最多会从popen获得一行输出,并且read可能会挂起等待EOL字符。
这整个方法充满了问题。 TTY设备需要精心呵护。你在黑暗中使用锤子。
答案 1 :(得分:2)
没有简单的方法来杀死popen
启动的进程,因为没有API来获取pid - 只有pclose
等待它自己的帐户结束(并且你应该< em>总是使用pclose
代替fclose
关闭FILE *
打开的popen
。)
相反,你可能最好不要使用popen
- 只需使用fopen
并用fputs写下你想要的东西:
fp = fopen("/dev/ttyACM0", "r+");
fputs("xyz\n", fp); // include the newline explicitly
fflush(fp); // always flush after writing before reading
while (fgets(ret_val, sizeof(ret_val)-1, fp) != NULL) {
: