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