无法从CLI

时间:2016-08-17 14:09:57

标签: c# command-line-interface

我有一个连接到ST-Link的程序。您可以从组合框中选择固件,按开始键,它会将固件编程到连接到ST-LInk的电路板上。

为此,我使用CLI使用ST-LINK_CLI.exe将命令发送到ST-Link。一旦固件被编程,它就出现在命令提示符上:"运行应用程序退出"。在这里,用户按下回车键,应用程序在板上运行,CLI退出。

但是,我需要它做的是没有用户按下Enter的提示,并且只是自动执行。

我这样做的想法是从CLI读取输出,并找出提示用户时的输出。我想我可以做一个循环,读入输出数据,当用户必须按回车键时输出数据匹配时,我将使用SendKeys.Send(" {ENTER}")

但是,我在阅读数据时遇到了问题。以下内容尚无效:

        string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe";
        string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC";

        Process p = new Process();
        p.StartInfo.FileName = STPath;
        p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run ";
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = false;

        p.Start();
        p.BeginOutputReadLine();
        p.WaitForExit();

        while (!p.StandardOutput.EndOfStream)
        {

            string line = p.StandardOutput.ReadLine();
            File.WriteAllText("New.txt", line);

        }

以下是出现的错误消息: "未处理的类型' System.InvalidOperationException'发生在System.dll中并指向流部分的结尾。

我想知道是否有人知道为什么会这样?或者如果提示问题还有另一种方法吗?

由于 露

3 个答案:

答案 0 :(得分:1)

如果CLI应用程序使用标准I / O,您只需写入输入流:

p.StandardInput.WriteLine();

另请注意,当您重定向流时,必须从中读取。在您的情况下,您只读取一行,然后等待程序退出。如果程序打印出更多适合缓冲区的文本,则会出现死锁。摆脱p.WaitForExit(),这是毫无意义和危险的。

答案 1 :(得分:1)

您将获得异常,因为p.BeginOutputReadLine()启动异步读取。这通常会在处理outputdatareceived事件时结束。

但是你不处理这个事件,因为async事件是长时间运行的,并且在发生对ReadLine()的同步调用时没有完成,这与异步读取不兼容。

我怀疑你需要的是用这样的代码替换你的代码:

    string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe";
    string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC";

    using (Process p = new Process())
    {
        p.StartInfo.FileName = STPath;
        p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run ";
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = false;

        p.Start();

        while (!p.StandardOutput.EndOfStream)
        {
            string line = p.StandardOutput.ReadLine();
            Console.WriteLine(line);
            if (line == "run application to exit")
            {
                p.StandardInput.WriteLine();
            }
        }

        p.WaitForExit();
    }

答案 2 :(得分:0)

可能不是最好的方法,但是为了让它在没有用户的情况下退出并且仍在运行,我只是不断地向其发送回车键直到它退出。

 while (process.HasExited == false)
                {
                    SendKeys.SendWait("{ENTER}");
                }