Hallo wertes kollektives Wissen!
Ich wende mich an euch, da ich bei einem kleinen Projekt ein Problem
habe und mir keine plausible Begründung einfällt, woran es liegen
könnte.
Ausgangssituation:
Ich verwende einen ATMega328PB mit zwei UARTs. Auf einem UART möchte ich
einen Sensor auslesen, den anderen möchte ich dazu nutzen, den Messwert
umgewandelt an ein Funkmodul zu übertragen. Ich nutze Atmel Studio
7.0.1645 mit der Atmel Toolchain 7.0.895.
Als UART-Library nutze ich jene von Peter Fleury, die ich um den
ATMega328PB erweitert habe. Darüber hinaus habe ich die Funktionen
uart_putc und _puts um einen weiteren Parameter, nämlich "FILE *stream"
ergänzt, um ein paar Compiler-Warnungen zu verhindern. Genutzt wird der
Parameter nicht. Und die entsprechenden Funktionen sind nun nicht mehr
void, sondern geben 0 zurück, wenn alles okay ist. Beides waren schon
(kosmetische) Maßnahmen, um mein Problem zu beheben. Ohne Erfolg.
Aus Gründen der Bequemlichkeit und der Formatierung möchte ich die UARTs
mit fprintf() ansprechen.
Anlegen der Streams der UARTs für ftprintf():
1 | FILE uart0_stream = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_RW);
|
2 | FILE uart1_stream = FDEV_SETUP_STREAM(uart1_putc, uart1_getc, _FDEV_SETUP_RW);
|
Um testweise mit dem "normalen" printf() zu arbeiten, habe ich stdout
und -in auch noch auf den entsprechenden Stream eines UARTs umgeleitet:
1 | stdout = &uart0_stream;
|
2 | stdin = &uart0_stream;
|
Folgende Funktionen liefern wider Erwarten am UART nur das erste Zeichen
des Strings (uart0 und uart1 sind dabei gleichermaßen betroffen):
1 | fprintf(&uart0_stream, "Hallo");
|
2 | fprintf(&uart0_stream, "%s", "Hallo");
|
3 | fputs("Hallo", &uart0_stream);
|
Folgende Funktionen funktionieren problemlos:
1 | printf( "Hallo");
|
2 | fprintf(&uart0_stream, "H%s", "allo");
|
3 | puts("Hallo"); //Allerdings mit LF
|
Basierend auf den Beobachtungen kann ich folgende Annahmen treffen:
- Die "Bitpopelei auf Fußpilzebene", also meine uart_putc-Funktionen
funktionieren einwandfrei
- printf() funktioniert
- fprintf() funktioniert eigentlich auch
- fptintf() nutzt unter gewissen Bedingungen fputs()?
- Der Optimizer scheint für fprintf() entweder fputs() zu nutzen oder
nicht, je nachdem, ob ein String während der Laufzeit zusammengesetzt
werden muss oder nicht.
- fputs() scheint ne Macke zu haben.
Da ich beide UARTs nicht parallel benötige, könnte ich eine
Wrapper-Funktion erstellen, die entsprechend dem übergeben Stream dann
stdout und -in einstellt und intern printf() nutzt, aber das würde auch
nur die Sympthome und nicht die Ursache beheben.
Habt ihr irgendwelche Vorschläge, an welchen Stellen ich nach der
Ursache für das Problem suchen kann?
Habe ich einen Bug in fputs() gefunden? Aber ich bin ja nicht der erste,
der die Funktion verwendet....
Vielen Dank!
Sebastian