代码之家  ›  专栏  ›  技术社区  ›  Kan-Ru Chen

如何从串行控制台的角度知道程序已退出

  •  2
  • Kan-Ru Chen  · 技术社区  · 16 年前

    我有一个通过串行端口与目标通信的程序。目标很可能是一个shell或类似的程序。如果我想向目标发送几个命令,我如何知道一个命令是结束的,以便我可以发送下一个命令?

    我有一些想法,比如捕捉shell提示符,或者让命令在退出之前输出一些文本。但这会增加复杂性。我想知道是否还有其他更简单的方法来实现它。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Doug T.    16 年前

    如果没有返回给发出命令的代理的信息(带有某种完成指示),就不可能知道命令是否结束。考虑一下*nix终端是如何工作的。nix终端完全是为同样的情况开发的——通过某种管道向另一台pc发出远程命令。在这种情况下,用户如何知道她可以键入另一个命令?在默认情况下,它会提示您发出另一个命令,让您知道它已经完成了。在edge情况下,它允许您从shell获得进程分叉,在shell中,您将得到作业已完成的指示。

    似乎最简单的解决方案是按照“完成”的行来回音。

    一些基本的伪码

     for (command in commands)
     {
         IssueCommand(command);
         result = "";
         while (result != "complete")
         {
             // read serial port append to result
             result += read(serialPort);
         }
     }
    
        2
  •  2
  •   fupsduck    16 年前

    如果要将命令发送到返回提示的shell程序,请在发送命令后说“$”,然后肯定可以等到看到“$”后再发送下一个命令。这是一个非常初级的协议,但应该工作得很好。

    为了避免担心来自控制台的回显数据中存在“$”,请关闭控制台上的回显或将提示更改为不太可能出现在回显数据中的内容。

    从技术上讲,您可以使用控制台输入缓冲区(typeahead),方法是发送一批长度小于输入缓冲区(您必须对此进行测试)的命令,如CMD1[CR]CMD2[CR]CMD3[CR],但在返回之前不要再发送任何命令。[CR]可能需要是[CR][LF],“$”实际上可能是“$”,具体取决于控制台的工作方式。

    在xon/xoff打开的情况下,您可以从技术上检查xoff是否停止发送,然后在看到xon时继续发送,但如果要发送到命令控制台,我不建议这样做。您需要确保xon/xoff缓冲区与控制台输入缓冲区匹配,这确实会更复杂。

        3
  •  0
  •   McPherrinM    16 年前

    可以使用的一种方法是发出某种标记,例如eof byte。检查所有传入的字节,看它们是否是EOF字节。你也可以选择其他字节。