/dev/ttyACM0 | cat - /dev/ttyACM0",-6ren">
gpt4 book ai didi

c - 在 C 中使用后立即终止 cat 命令

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:16 25 4
gpt4 key购买 nike

所以我通过使用 echo 发送和 cat 接收来与设备通信。这是我的代码片段:

fp = popen("echo "xyz" > /dev/ttyACM0 | cat - /dev/ttyACM0", "r");
while (fgets(ret_val, sizeof(ret_val)-1, fp) != NULL)
{
if (strcmp(ret_val, "response") == 0)
{
close(fp);
return ret_val;
}
}

好的,问题是,cat 似乎保持打开状态,因为当我循环运行这段代码时,它第一次运行,然后在我调用 popen 的地方挂起。我假设猫是罪魁祸首是否正确?

是否有一种方法可以在我运行命令后立即终止 cat,以便我只从我的设备获得响应?谢谢!

最佳答案

在命令中:

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\")");

请记住,回显和读取都可能挂起等待载体,并且您最多只能从 popen 获得一行输出,而读取可能挂起等待 EOL 字符。

整个方法充满了问题。 TTY 设备需要精心呵护。你在黑暗中使用锤子。

关于c - 在 C 中使用后立即终止 cat 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com