Forum: Mikrocontroller und Digitale Elektronik PC-Applikation C# mit ST-Link und CLI-Interface


von Martin F. (Firma: CP contech electronic GmbH) (tinochio)


Angehängte Dateien:

Lesenswert?

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

von rubger (Gast)


Lesenswert?

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.

von tinochio (Gast)


Angehängte Dateien:

Lesenswert?

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

von rubger (Gast)


Lesenswert?

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.

von Martin F. (Firma: CP contech electronic GmbH) (tinochio)


Lesenswert?

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

von rubger (Gast)


Lesenswert?

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.

von rubger (Gast)


Lesenswert?

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

von Martin F. (Firma: CP contech electronic GmbH) (tinochio)


Lesenswert?

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
Noch kein Account? Hier anmelden.