Hallo, für eine Prüfanwendung ich habe in einer PC-Applikation (MS VS2010-C#) einen Aufruf zum Programmieren eines STM32-Controllers über das CLI-Interface (CommandLineinterface ST-LINK_CLI.exe) mit einem ST-LINK/V2 Programmer. Der Aufruf im Programm sieht folgendermassen aus: "ST-LINK_CLI.exe -c SWD -P C:\STM\ST-LINK_Utility\HEXFILE.hex -V" Mit dem "-c" connected er sich, mit -P wird programmiert, und mit -V wird verifiziert. Funktioniert alles ganz hervorragend, beim Aufruf poppt eine Art DOS-Box auf, die Aktionen werden erledigt, und dann verschwindet die Anwendung (CLI) wieder sang- und klanglos. Ich benötige aber für meinen Programmablauf noch eine Rückmeldung, ob es geklappt hat, oder ob ein Fehler aufgetreten ist. Hat jemand Erfahrungen oder einen Lösungsvorschlag? - das Umleiten der Textausgaben in eine LOG-Datei ( ... > LOG.txt)funktioniert irgendwie nicht. - mit .NET kann man vor dem Starten des Prozesses Standard-Output umleiten und sich als String am Schluss vom Prozess holen. Aber dann entfallen die Verlaufsbalken (siehe SCAN), und die "DOS-Box" bleibt schwarz (klar). Das wäre eventuell ein Lösungsansatz, man müsste den String dann nach bekannten Inhalten durchsuchen, aber sehr aufwändig. - kann man dem ST-LINK_CLI.exe irgendwie eine LOG-Datei entlocken? Hat jemand sonst noch eine Idee zu diesem Thema? Vielen Dank schon mal Martin Fölling
Hallo, ich sitze vor nahezu dem selben Problem, ich entwerfe Prüfanwendungen unter Borland C++ Builder und versuche verzweifelt, einen Prüfling mit STM32-Controller mit einem ST-LINK/V2 Programmer zu flashen. Der erste Schritt war der Aufruf aus einer Batch-Datei, das funktioniert zwar, die ST-LINK_CLI.exe liefert aber leider keine verwertbaren Rückgabewerte, daher ist ein Aufruf und Auswertung mit einer Batch-Datei nicht sinnvoll, weil man von Fehlern nichts mitbekommt. Der Aufruf aus meiner c++-Anwendung heraus mit CreateProcess und Ausgabeumleitung(mit CreatePipe) in meine Anwendung funktioniert nur, wenn es kein Programmier-Befehl ist. Das könnte mit dem Statusbalken zusammen hängen. ST-LINK_CLI.exe wird zwar gestartet, beendet sich aber nicht mehr. Ich hab schon beim ST-Support angefragt, warum ST-LINK_CLI.exe immer errorlevel=0 zurück gibt, auch wenn Fehler aufgetreten sind, aber noch keine konstruktive Rückmeldung, nur: "Ich frag mal die Entwickler!" Suche also auch weiterhin nach Ideen, wie ich ST-LINK_CLI.exe aus meiner Anwendung heraus starten und evtl. auftretende Fehler auswerten kann. mfg rubger.
Hallo, ich habe mich inzwischen zu folgender Lösung entschieden, etwas umständlich, aber offensichtlich liefert ST-LINK_CLI.exe außer den Textausgaben keine Rückgabewerte. Das Starten als Prozess funktioniert, allerdings nur dann, wenn man nach dem Programmieren kein Verify (-V) macht! Beim Verify bleibt die ganze Sache hängen und die Anwendung ist tot. Nur Programmieren geht, die Textausgaben werden umgeleitet, zerlegt, in einer ListBox ausgegeben, und Teile des Textes werden zum Result (erfolgreich/nicht erfolgreich umgesetzt. void Programmer_Programmieren() { String args = ""; //command= " -c SWD -P HEXFILE.hex -V"; // Anm. Verify funktioniert nicht!! //command= " -c SWD -r8 0x00 0x200"; // Test: speicherausgabe ... command = " -c SWD -P HEXFILE.hex"; int ExitCode; ProcessStartInfo ProcessInfo; Process process; ProcessInfo = new ProcessStartInfo("ST-LINK_CLI.exe", command); ProcessInfo.CreateNoWindow = false; ProcessInfo.UseShellExecute = false; // *** Redirect the output *** ProcessInfo.RedirectStandardError = true; ProcessInfo.RedirectStandardOutput = true; process = Process.Start(ProcessInfo); process.WaitForExit(); // *** Read the streams *** string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); ExitCode = process.ExitCode; String sResultOut = ("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output)); String sResultErr = ("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error)); String sResultExit = ("ExitCode: " + ExitCode.ToString()); Console.WriteLine(sResultOut); Console.WriteLine(sResultErr); Console.WriteLine(sResultExit, "ExecuteCommand"); // Split the string on line breaks. // ... The return value from Split is a string[] array. // http://www.dotnetperls.com/string-split // string[] sOutputLines = Regex.Split(sResultOut, "\r\n"); foreach (string line in sOutputLines) { listBox_ProgrammerOutput.Items.Add(line); } listBox_ProgrammerOutput.Items.Add(sResultErr); listBox_ProgrammerOutput.Items.Add(sResultExit); // Programmieren ok? Boolean bProgramierenOK = stringDurchsuchen(sResultOut, "Programming complete"); // mit LED den Status des BackgroundWorkers anzeigen: WORKING if (bProgramierenOK) { UpdateButtonText(button_LED_ProgErgebnis, "OK"); } else UpdateButtonText(button_LED_ProgErgebnis, "ERR"); } process.Close(); } Boolean stringDurchsuchen(String sZuDuchsuchenderString, string sPattern) { if (System.Text.RegularExpressions.Regex.IsMatch(sZuDuchsuchenderString, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { System.Console.WriteLine(" (match for '{0}' found)", sPattern); return true; } else { System.Console.WriteLine("match not found"); return false; } } Der String "Programming Complete" zur Beurteilung der Programmierergebnisses ist Teil des Ausgabetextes des ST-Link_CLI Programms (siehe Screenshot). Das zu meinem Stand, für weitere Infos wäre ich aber immer noch dankbar. (z.B., warum das Verify nicht geht, ....) Grüße und schönes WE Martin Fölling
Vielen Dank für den Hinweis, ohne das -v klappt es tatsächlich. jetzt muss ich nur noch die verschiedenen Fehlertexte abfangen, damit mein Programm auch weiß, was schief gegangen ist. Damit ist mir schon sehr geholfen. Trotzdem habe ich dem ST-support eine Rückmeldung gegeben, mit der Info, dass ein Aufruf aus dritt-Software nur funktioniert, wenn man -v weglässt. Ich habe zudem darum gebeten, eine Version von ST-LINK_CLI.exe zur Verfügung gestellt zu bekommen, die aussagekräftige Rückmeldungen(errorlevel) liefert. Mal sehen, ob sich da was tut. Also nochmal vielen Dank für den Tipp und ein schönes Wochenende. mfg rubger.
Guten Morgen, (schade, dass man hier so anonym kommuniziert! ...) ... aber nichts, desto trotz: an der Version wäre ich natürlich auch interessiert. Gruß M. Fölling
Antwort vom ST-Support bzgl. Errorlevel vom CLI: "It will be in the next revision of the tool which is scheduled to Feb 2012." Das -v Problem konnten die anscheinend noch nicht nachvollziehen, vll. wäre es hilfreich, wenn jemand denen das nochmal mit anderen Worten schildert. Und wenn keine Antwort kommt, ruhig nach ein paar Tagen nochmal nachhaken. Falls jemand neue Infos hat, wäre ich interessiert. Eine Programmierung in der Serienproduktion ohne verify ist eigentlich nicht ganz koscher, leider hab ich aber im Moment keine andere Möglichkeit. Nebenbei noch ein Tipp: beim Setzen von option-bytes (ReadProtection, BrownOutLevel) wird manchmal zwar gemeldet, dass es funktioniert hat, wenn man die bytes gegenliest, ist aber noch alles beim Alten. Also sollte man immer nochmal gegenlesen und prüfen. Gruß, rubger.
Hallo, habe gesehen, dass mittlerweile die Version 2.4 vom ST-Link Utility verfügber ist und hatte auch gerade die Möglichkeit das neueste ST-LINK CLI (Version 1.4.0)mal zu testen. Die Errorlevel funktionieren und auch das -v Problem tritt bei mir nicht mehr auf. Die Textausgaben scheinen kompatibel zu sein, so dass eine Umstellung auf die aktuellste Version problemlos sein müsste. (Falls man bislang die Textausgaben ausgewertet hat.) mit der -Q Option kann man jetzt die Ausgabe von Statusbalken unterdrücken, falls man die Textausgabe umleitet ist das sinnvoll. Gruß, rubger
Danke, dass du Deine neuen Erkenntnisse gepostet hast. Ich werde meine Software entsprechend anpassen, wenn ich wieder an der Baustelle bin. bis dahin Martin Fölling
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.