2016-08-17 8 views
2

Ich habe ein Programm, das an ST-Link angeschlossen ist. Im Moment können Sie eine Firmware aus einer Combobox auswählen, Start drücken und die Firmware auf der Platine programmieren, die an den ST-LInk angeschlossen ist.Ich kann keine Daten vom CLI lesen

Dazu verwende ich eine CLI, um Befehle mit ST-LINK_CLI.exe an den ST-Link zu senden. Sobald die Firmware programmiert ist, erscheint sie an der Eingabeaufforderung: "Anwendung zum Beenden ausführen". Hier drückt der Benutzer die Eingabetaste, und die Anwendung läuft auf der Karte und das CLI wird beendet.

Was ich jedoch tun muss, ist nicht die Eingabeaufforderung zu haben, wo der Benutzer die Eingabetaste drückt und es einfach automatisch macht.

Meine Idee war es, die Ausgabe von der CLI zu lesen, und herauszufinden, was die Ausgabe ist, wenn der Benutzer aufgefordert wird. Ich dachte, ich könnte dann eine Schleife machen, die Ausgabedaten werden eingelesen und wenn es mit den Ausgabedaten übereinstimmt, wenn der Benutzer die Eingabetaste drücken muss, werde ich SendKeys.Send ("{ENTER}") verwenden.

Allerdings habe ich Probleme beim Lesen der Daten. Die folgenden nicht funktioniert:

 string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe"; 
     string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC"; 

     Process p = new Process(); 
     p.StartInfo.FileName = STPath; 
     p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run "; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.CreateNoWindow = false; 

     p.Start(); 
     p.BeginOutputReadLine(); 
     p.WaitForExit(); 

     while (!p.StandardOutput.EndOfStream) 
     { 

      string line = p.StandardOutput.ReadLine(); 
      File.WriteAllText("New.txt", line); 

     } 

Das Folgende ist die Fehlermeldung, die aufkommt: „eine nicht behandelte Ausnahme des Typs‚System.InvalidOperationException‘aufgetreten in System.dll und zeigt auf das Ende des Stromteil.

ich habe mich gefragt, ob jemand wusste, warum dies geschah? Oder wenn es einen anderen Weg, um die prompte Ausgabe ist?

Dank Lucy

Antwort

0

nicht der beste Weg gewesen sein kann zu Tun Sie dies, aber um es zu beenden, ohne den Benutzer und immer noch laufen, schickte ich einfach die Enter-Taste, bis es beendet wurde.

while (process.HasExited == false) 
       { 
        SendKeys.SendWait("{ENTER}"); 
       } 
+0

Ist dies eine geschäftige Schleife? Wenn dies der Fall ist, kann es sinnvoll sein, einen "Ruhezustand" -Aufruf (möglicherweise für 50 Millisekunden) hinzuzufügen, um die Anzahl der gesendeten Tastendrücke und den Umfang der CPU-Auslastung zu begrenzen. –

+0

Das ist eine gute Idee, danke – lucycopp

1

Wenn die CLI-Anwendung Standard-I unter Verwendung von/O, können Sie einfach mit dem Eingangsstrom schreiben:

p.StandardInput.WriteLine(); 

Beachten Sie auch, dass, wenn Sie Ströme umleiten, Sie Muss von ihnen lesen. In Ihrem Fall lesen Sie nur eine einzelne Zeile und warten dann auf das Beenden des Programms. Wenn das Programm mehr Text ausgibt, der in die Puffer passt, erhalten Sie einen Deadlock. Nur loswerden p.WaitForExit(), es ist sinnlos und gefährlich.

1

Sie erhalten die Ausnahme, weil p.BeginOutputReadLine() einen asynchronen Lesevorgang startet. Dies würde normalerweise mit der Behandlung des Ereignisses outputdatareceived beendet werden.

Allerdings behandeln Sie dieses Ereignis nicht als solches. Das async-Ereignis wird lange ausgeführt und ist nicht beendet, wenn der synchrone Aufruf von ReadLine() stattfindet, was mit dem asynchronen Lesen inkompatibel ist.

Ich vermute, dass das, was Sie benötigen, um Ihren Code mit so etwas zu ersetzen ist:

string STPath = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\ST-LINK Utility\ST-LINK_CLI.exe"; 
    string path2 = @"C:\Users\Falconex\Documents\FalconexTest\FalconexTest\Firmware\PXL3-DELL-2B.SREC"; 

    using (Process p = new Process()) 
    { 
     p.StartInfo.FileName = STPath; 
     p.StartInfo.Arguments = "-ME -p " + firmwareLocation + " -v -Run "; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.CreateNoWindow = false; 

     p.Start(); 

     while (!p.StandardOutput.EndOfStream) 
     { 
      string line = p.StandardOutput.ReadLine(); 
      Console.WriteLine(line); 
      if (line == "run application to exit") 
      { 
       p.StandardInput.WriteLine(); 
      } 
     } 

     p.WaitForExit(); 
    } 
Verwandte Themen