2016-07-28 13 views
0

私はいくつかのArduinosを実行して制御するためにC#winformアプリケーションを作成しています。 Arduinosはオンザフライでプログラミングされているので、テストする必要があるものに応じて同じDuinoを使用して多くのタスクを実行できます。CMDウィンドウの出力をRichTextWindowにリダイレクト

オンザフライでのプログラミングは簡単ですが、下のコードを見てください。わかるように、私はAVRDudeと呼ばれる別のプログラムを実行し、パラメータを送信する必要があります。これはまだOKですが..... .....

AVRDudeはDOSなので、CMDウィンドウを開いてその出力を入れます。問題は、私のApps RichTextWindowにその出力が欲しいということです。私はいくつかの例を見つけて、それを理解しようとしていますが、私は明らかに私が助けを求めている重要な部分を見逃しています。

私はAVRDudeからの出力をリダイレクトしようとしていますが、空の文字列しかありません。何が私がそれを私のRichTextWindow AVRDude intからの出力をキャプチャすることができますが逃したことがあります。

私のコードは以下の通りです:

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. はバックの書き込みはリアルタイムではないので、それが唯一の完了時に リッチテキストボックスへの書き込みを意味し、リアルタイムではありません。 の方法についてのアイデアは、リアルタイムで書き込みますか?

  2. 私が必要とするテキストの一部は標準エラーセクションにありますが、なぜ、どのアイデアもうまくいかないことがわかりましたか?

注コメントアウト面積は、私はちょうど私のコードに残ったが、現時点で使用していない、あなたが戻って書いてドゥイーノをプログラムすることができます。

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 
    } 
関連する問題