正在将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");
        }));
    }

正在将CMD窗口输出重定向到RichTextWindow

经过更多的搜索和尝试,我(使用其他人的代码进行修改)找到了几乎100%我需要的解决方案。但是。。。。我现在面临的问题是:

  1. 回写不是实时的,这意味着它只向富格文本框完成时,因此不是实时的。关于如何让它实时写入?

  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
   }