Я пишу приложение winform C# для запуска и управления несколькими Arduinos. Arduinos запрограммированы «на лету», поэтому я могу использовать один и тот же Duino для выполнения многих задач в зависимости от того, что мне нужно проверить.Перенаправление вывода окна CMD в RichTextWindow
Программирование «на лету» легко видно из кода ниже, но, как вы можете видеть, мне нужно запустить отдельную программу под названием AVRDude и отправить ее параметры. Это все еще нормально, но .....
AVRDude - это DOS, поэтому открывается окно CMD и помещается в него. Проблема в том, что я хочу, чтобы это выводилось в мои приложения RichTextWindow. Поиск вокруг я нахожу несколько примеров и пытаюсь понять их, что я, кажется, делаю, но, очевидно, я пропустил жизненно важную роль, поэтому я прошу о помощи.
Я пытаюсь перенаправить вывод из AVRDude, но все, что я получаю, это пустая строка. Что я пропустил, это позволит мне захватить вывод AVRDude в моем RichTextWindow.
Мой код ниже:
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");
}));
}