将CMD窗口输出重定向到RichTextWindow

时间:2016-07-28 10:48:24

标签: c# arduino richtextbox

我正在编写一个C#winform应用程序来运行和控制几个Arduinos。 Arduinos是动态编程的,因此我可以使用相同的Duino来完成许多任务,具体取决于我需要测试的内容。

动态编程很容易看到下面的代码但是你可以看到我必须运行一个名为AVRDude的独立程序并发送它参数。这仍然可以但是......

AVRDude是DOS,因此打开一个CMD窗口并将其输出放入其中。问题是我希望输出到我的Apps 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");
        }));
    }

1 个答案:

答案 0 :(得分:0)

经过大量的搜索和大量的尝试后,我提出了(使用其他代码进行了我的修改),几乎100%我需要的解决方案。但是......我现在的问题是:

  1. 回写不是实时的,这意味着它只写入 Rich Text Box在完成时不是实时的。关于如何做的任何想法 让它实时写?

  2. 我发现我需要的一些文字是在标准错误部分,但无法找出原因,任何想法?

  3. 请注意,注释掉的区域允许您编写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
       }