Forum: Mikrocontroller und Digitale Elektronik STM32 fprintf() über UART gibt nur erste Zeile aus


von A.. P. (arnonym)


Lesenswert?

Hallo Gemeinde,

ich habe nun seit ein paar Tagen ein kleines Problem, welches nicht 
bedrohlich für mein Projekt ist, allerdings möchte ich die Dinge gerne 
möglichst bis auf den Kern verstehen und kann das so nicht stehen lassen 
:D

Konkret geht es darum:
Ich bin vor kurzem auf die Atollic IDE gewechselt und arbeite an einem 
STM32F030. In meinem Projekt habe ich mir ein Debug-Makro angelegt, mit 
dem ich bequem Debug-Nachrichten über das UART senden kann (haben andere 
Leute vor mir auch schon hundertfach gemacht :D). Ich führe hier jetzt 
zunächst mal nur das nötigste auf, bei Bedarf kann ich andere Teile 
hinzufügen, die zur Lösung beitragen können.
1
#define DEBUG(s, ...)    fprintf(stdout, s, ##__VA_ARGS__); fflush(stdout);
2
3
4
void stdio_init(int init) {
5
    // Turn off buffers, so I/O occurs immediately
6
    setvbuf(stdin, NULL, _IONBF, 0);
7
    setvbuf(stdout, NULL, _IONBF, 0);
8
    setvbuf(stderr, NULL, _IONBF, 0);
9
}
10
11
12
int _write(int file, char *data, int len)
13
{
14
  while (len--) {
15
    //fputc(*data++, stdout);
16
    debug_LL_PutC(*data++);
17
  }
18
  return len;
19
}

Hinter debug_LL_PutC() verbirgt sich einfach nur meine Methode, welche 
das Zeichen wie gewohnt über das UART ausgibt. Standardcode...

Die Zeichen kommen an sich nun auch wunderbar an, das Buffering habe ich 
auch im Code deaktiviert, sodass auch die Zeichen immer sofort 
rausgehen. Und nun kommt mein ganz spezielles Problemchen, welches ich 
nun leider nicht mit den vielen Infos aus dem Netz und auch hier aus dem 
Forum lösen konnte.

Bei mir will mein Makro bei mehrzeiligem Text lediglich die erste Zeile 
ausgeben. Nach dem ersten Auftreten eines \r\n ist Schluss. Ein 
Beispiel:

Sende ich
1
DEBUG("Dies ist eine Zahl: %d\r\n", 123);

so sehe ich noch korrekr im Terminal meinen Text "Dies ist eine Zahl: 
123".

Sende ich aber nun an das Terminal
1
DEBUG("Dies ist ein\r\n mehrzeiliger Text");

so sehe ich nur "Dies ist ein" im Terminalfenster. Die fehlende(n) 
Zeile(n) verabschieden sich dann für immer. Ich weiß nun leider 
überhaupt nicht, wo ich noch rumbiegen kann oder wo ich noch eine 
Funktion umleiten muss, damit mein Programm nicht beim ersten 
Zeilenumbruch das senden des Texts beendet.

Es ist nur etwas nervig beim Debuggen, da ich mir bspw. einen 
HTTP-Header, den ich mit meinem Code zusammenbaue, ausgeben lasse und 
dabei dann leider immer nur die erste Zeile "GET / HTTP/1.1" zu lesen 
ist und der Rest nach dem ersten Zeilenumbruch eben nicht mehr.
Ich bin auf dem Gebiet der verschiedenen C-Compiler und 
Library-Versionen der unterschiedlichen Hersteller nicht firm und weiß 
deshalb nicht, ob sich irgednwo bei Atollic vielleicht noch eine 
Funktion oder ein Schalter verbirgt, den man überschreiben muss, damit 
das funktioniert.

Wenn ich mit dem Debugger durch meinen Code gehe, so sehe ich auch ganz 
klar, dass die Methode _write auch immer nur mit einem len-Parameter 
aufgerufen wird, der immer nur bis zum ersten Zeilenumbruch reicht. Der 
Rest des Puffers ist danach nur mit anderen Zeichen beschrieben und der 
nächste Aufruf enthält dann bereits die nächste Nachricht.

Über jeden Hinweis, der zur Lösung des Problems beiträgt, bin ich 
dankbar :)

Gruß
Anton

von asdfasd (Gast)


Lesenswert?

Dein _write gibt immer -1 zurück ...

von A.. P. (arnonym)


Lesenswert?

Ich schäme mich... XD Scheint wohl ein typischer Anfall von Übermüdung 
zu sein. Die Zeit, die ich mir für meinen Schrieb genommen habe, hätte 
ich besser mal geschlafen hahaha

Danke dir!

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.