正在将CMD窗口输出重定向到RichTextWindow
本文关键字:重定向 RichTextWindow 输出 窗口 CMD | 更新日期: 2023-09-27 17:59:06
我正在编写一个C#winform应用程序来运行和控制几个Arduino。Arduinos是动态编程的,所以我可以使用相同的Duino来完成许多任务,这取决于我需要测试的内容。
动态编程很容易,请参阅下面的代码,但正如您所看到的,我必须运行一个名为AVRDude的单独程序并向其发送参数。这还可以,但是。。。。。
AVRDude是DOS,所以打开一个CMD窗口并将其输出放入其中。问题是我想把这个输出输入到我的应用程序RichTextWindow中。我四处寻找,找到了几个例子,并试图理解它们,我似乎做到了,但显然我错过了一个重要的部分,这就是我寻求帮助的原因。
我试图重定向AVRDude的输出,但我得到的只是空字符串。我错过了什么,这将使我能够在RichTextWindow中捕获AVRDude的输出。
我的代码如下:
private void program_duino()
{
var choice = cbobx_device.SelectedIndex;
string partno = "";
string programmer = "";
string baudrate = "";
switch (choice)
{
case 0:
partno = "atmega2560";
programmer = "wiring";
baudrate = "115200";
break;
case 1:
partno = "m328p";
programmer = "arduino";
baudrate = "115200";
break;
default:
break;
}
using (Process sortProcess = new Process())
{
sortProcess.StartInfo.FileName = @"avrdude.exe";
sortProcess.StartInfo.Arguments = @"-Cavrdude.conf -p" + partno + " -c" + programmer + " -P" + cmbPortName.Text + " -b" + baudrate + " -D -Uflash:w:'"" + txtbx_hexfile.Text + "'":i -v";
sortProcess.StartInfo.CreateNoWindow = true;
sortProcess.StartInfo.UseShellExecute = false;
sortProcess.StartInfo.RedirectStandardOutput = true;
// Set event handler
sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
// Start the process.
sortProcess.Start();
// Start the asynchronous read
sortProcess.BeginOutputReadLine();
sortProcess.WaitForExit();
}
}
void SortOutputHandler(object sender, DataReceivedEventArgs e)
{
Trace.WriteLine(e.Data);
this.BeginInvoke(new MethodInvoker(() =>
{
rchtxbx_output.AppendText(e.Data ?? string.Empty);
// Log(LogMsgType.Incoming, "'n" + (e.Data ?? string.Empty) + "'n");
}));
}
经过更多的搜索和尝试,我(使用其他人的代码进行修改)找到了几乎100%我需要的解决方案。但是。。。。我现在面临的问题是:
-
回写不是实时的,这意味着它只向富格文本框完成时,因此不是实时的。关于如何让它实时写入?
-
我发现我需要的一些文本在标准错误部分,但无法找出原因,有什么想法吗?
请注意,注释区允许您通过回写对duino进行编程,我刚刚留在代码中,但目前没有使用。
private void program_duino()
{
var choice = cbobx_device.SelectedIndex;
string partno = "";
string programmer = "";
string baudrate = "";
switch (choice)
{
case 0:
partno = "atmega2560";
programmer = "wiring";
baudrate = "115200";
break;
case 1:
partno = "m328p";
programmer = "arduino";
baudrate = "115200";
break;
default:
break;
}
// ProcessStartInfo startInfo = new ProcessStartInfo();
// startInfo.UseShellExecute = false;
// startInfo.FileName = @"avrdude.exe";
// startInfo.Arguments = @"-Cavrdude.conf -p" + partno + " -c" + programmer + " -P" + cmbPortName.Text + " -b" + baudrate + " -D -Uflash:w:'"" + txtbx_hexfile.Text + "'":i -v";
// Process.Start(startInfo);
Process avrprog = new Process();
StreamReader avrstdout, avrstderr;
StreamWriter avrstdin;
ProcessStartInfo psI = new ProcessStartInfo("cmd");
psI.UseShellExecute = false;
psI.RedirectStandardInput = true;
psI.RedirectStandardOutput = true;
psI.RedirectStandardError = true;
psI.CreateNoWindow = true;
avrprog.StartInfo = psI;
avrprog.Start();
avrstdin = avrprog.StandardInput;
avrstdout = avrprog.StandardOutput;
avrstderr = avrprog.StandardError;
avrstdin.AutoFlush = true;
avrstdin.WriteLine("avrdude.exe -Cavrdude.conf -p" + partno + " -c" + programmer + " -P" + cmbPortName.Text + " -b" + baudrate + " -D -Uflash:w:'"" + txtbx_hexfile.Text + "'":i -v");
avrstdin.Close();
Log(LogMsgType.Incoming, "'n" + (avrstdout.ReadToEnd()) + "'n");
Log(LogMsgType.Incoming, "'n" + (avrstderr.ReadToEnd()) + "'n");// no idea why I have errors here but I write them as Incoming
}