Hallo allerseits, zur Zeit habe ich leider keine Zielhardware, muss aber ein relativ komplexes Modul testen. Daher habe ich mir ein mtest_main.c mit einer Mainloop geschrieben, um in diesem Rahmen meine Module auszuführen und testen zu können. Per getc() lese ich einzelne Zeichen ein und führe dann die enspechenden Funktionen aus. Auf dem Zielsystem sind ausserdem nur rudimentäre Testfunktionen vorhanden. Bisher habe ich mich um die Eingabe zusätzlicher Parameter herum gedrückt, weil meine ersten Versuche mit scanf() nicht besonders überzeugend waren. Schön wäre es, wenn ich eine Lösung finden würde die beliebige Parameter zulassen würde. Beispiel: test: a <cr> <... response ...> test: e 1fffffff 34 <CR> <... response ...> etc. Mein Ziel wäre quasi ein Testframe für Modultests auf dem Entwicklungssystem um die Funktion des Codes zu prüfen. Denkbar wäre aber auch, wenn man ein CLIB verwenden kann, Tests per RS232 und Terminal auf dem Zielsystem auszuführen. Hat jemand ein Idee? Meine Umgebung ist: - Zielsystem ARM7 (per ARM Compiler) - Entwicklungssystem: Debian/Linux, Anjuta, gnu tools, gnuc. Ich denke mir, diese Problemstellung ist nicht neu. Vermutlich gibt es bereits einen brauchbaren Lösungsansatz oder sogar einen einfachen generic Testrahmen.
Statt scanf bietet sich IMHO die Kombination aus fgets und sscanf an. fgets liest eine komplette Zeile ein (terminiert durch CR), sscanf kann -nach inhaltlicher Prüfung- auf diese eingelesene Zeile losgelassen werden. fgets sollte statt gets verwendet werden, da gets die Länge des übergebenen Puffers nicht überprüfen kann und so ein schöner Kandidat für Speicherprobleme (buffer overflow) ist.
Der primitive "Kommando-Interpreter" aus meiner MCP-Testsoftware mag vielleicht inspirieren, Nichts dolles aber funktioniert "gut genug". http://www.siwawi.arubi.uni-kl.de/avr_projects/can/index.html ("Version 0.9"-Archiv)
Hallo allerseits, zunächst einmal vielen Dank für die Anregungen. Ich ziehe in diesem Fall die Möglichkeiten der LIBC und stdio vor, weil diese in der Regel für alle Plattformen sofort verfügbar sind. Auf dem Zielsystem kostet das natürlich zusätzlich Platz und Laufzeit. In diesem Fall wäre dann der Lösungsansatz aus dem MCP-Projekt eine brauchbarer Weg. Allerdings ohne die Möglichkeiten (den Luxus) per printf() formatierte Ausgaben verwenden zu können. Mit sscanf() laufe ich vermutlich in die selben Probleme wir mit scanf(), weil ich unterschiedlich formatierte Eingabestrings verwenden möchte. Eventuell kann ich die ersten Zeichen auswerten und dann eine passendes sscanf() auf den String anwenden. Ausserdem kann man prüfen ob die korrekte Anzahl an Argumenten übergeben wurde. int anzahl = 0; if( cmd_strg[0] = 'm') { anzahl = sscanf( ch, "%s %x %x\n", arg1, var1, var2); ... } else if( cmd_strg[0] = 'n') { anzahl = sscanf( ch, "%s %s\n", arg1, arg2); ... } Danke für die Hinweise. Josef PS. Wenn die Funktion steht, werde ich sie hier posten.
> Mit sscanf() laufe ich vermutlich in die selben Probleme wir mit > scanf(), weil ich unterschiedlich formatierte Eingabestrings > verwenden möchte. Nein, scanf() direkt auf der Eingabe ist wirklich was anderes. Ich hatte das mal bisschen probiert, als ich die scanf-Bibliothek für avr-libc geschrieben habe, das will man wohl nicht wirklich benutzen. fgets() + sscanf() ist oft genug wirklich besser handhabbar.
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.