我有一个连接到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中并指向流部分的结尾。
我想知道是否有人知道为什么会这样?或者如果提示问题还有另一种方法吗?
由于 露
答案 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}");
}