2016-07-28 3 views
0

Я пишу приложение 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"); 
     })); 
    } 

ответ

0

После намного больше поисков и много попыток я придумал (используя код от других с моими изменениями) с почти 100%, что мне нужно решение. НО .... этот вопрос в настоящее время у меня есть:

  1. Запись обратно не в реальном времени, что означает, что он пишет только в Rich Text Box по завершении так не в реальном времени. Любые идеи о том, как заставить писать в режиме реального времени?

  2. Я считаю, что часть текста, в котором я нуждаюсь, находится в разделе «Стандартные ошибки», но не может решить, почему, какие-либо идеи?

Обратите внимание, что в области с комментариями вы можете запрограммировать 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 
    } 
Смежные вопросы