mikrocontroller.net

Forum: Compiler & IDEs Modultests mit scanf


Autor: Josef Zimmermann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...
("Version 0.9"-Archiv)

Autor: Josef Zimmermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.