Frage zu UART Tutorial

OP #4632878
Hallo zusammen,

ich habe ein Frage zum UART Tutorial. Mir geht es dabei um das senden 
eines Strings. Dazu werden zwei Funktionen benötigt. uart_putc und 
uart_puts.
Die Funktion uart_puts übergibt die einzelenen Adressen der char an 
uart_putc. Innerhalb uart_putc wird geprüft ob das senden des Zeichens 
möglich ist und wenn das der Fall ist, es auch gesendet. Wie verhält es 
sich hier mit dem Zeitlichen Timing?

uart_puts übergibt doch ohne Rücksicht auf das "warten bis Senden 
möglich" Adressen der char an uart_putc, oder? Können dadurch nicht 
einzelne Zeichen verpasst werden?
Die Baudrate habe ich auf 9600 gesetzt, 8 Datenbit, ein Stoppbit, keine 
Parität. Mit dem Startbit komme ich dann auf 10Bit. bei einer Baudrate 
von 9600 komme ich auf eine Übertragungszeit eines einzelnen Zeichens 
von 1,04ms. Der µC läuft mit 16Mhz. Die Schleife in uart_puts läuft doch 
somit mit Sicherheit schneller als mit 1,04ms?

1
/* ATmega16 */
2
int uart_putc(unsigned char c)
3
{
4
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
5
    {
6
    }                             
7
 
8
    UDR = c;                      /* sende Zeichen */
9
    return 0;
10
}
11
 
12
 
13
/* puts ist unabhaengig vom Controllertyp */
14
void uart_puts (char *s)
15
{
16
    while (*s)
17
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
18
        uart_putc(*s);
19
        s++;
20
    }
21
}
Gast
Hi

>uart_puts übergibt doch ohne Rücksicht auf das "warten bis Senden
>möglich" Adressen der char an uart_putc, oder? Können dadurch nicht
>einzelne Zeichen verpasst werden?

Nein. uart_putc wartet mit

while (!(UCSRA & (1<<UDRE)))

bis die UART ein Zeichen aufnehmen kann.

MfG Spess
Hans M. schrieb:
> Können dadurch nicht
> einzelne Zeichen verpasst werden?

Nein, können nicht verpasst werden. uart_puts() übergibt zwar ohne zu 
warten die einzelnen Zeichen an uart_putc() aber uart_puts() arbeitet 
sequenziell (wie jedes C-Programm), d.h. an der Stelle
1
...
2
uart_putc(*s);
3
...

geht es erst dann weiter wenn uart_putc() vollständig abgearbeitet ist 
und uart_putc() wartet ja mit
1
...
2
while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
3
    {
4
    }
5
...
darauf, dass der Sende-Puffer leer ist, also darauf, dass es das 
Zeichen, dass es bekommen hat, in den Sende-Puffer des UART schieben 
kann, d.h. das Zeichen, dass zuvor in den Sende-Puffer geschoben wurde 
muss vollständig gesendet worden sein. Deshalb geht hier kein Zeichen 
verloren.
Moderator Persönliche Seite
Mir geht es hier nicht um die eigentliche Frage, die meines Erachtens 
bereits beantwortet wurde, sondern um folgendes:

Hans M. schrieb:
> Die Funktion uart_puts übergibt die einzelenen Adressen der char an
> uart_putc.

Falsch. uart_puts() bekommt zwar einen Zeiger auf den String, ruft aber 
uart_putc() mit den einzelnen Zeichen selbst auf und nicht mit Adressen.

Du solltest Dir das Kapitel über Zeiger (insbesondere, was das Sternchen 
bedeutet) in Deinem C-Buch nochmals anschauen.

Hier wird angegeben, dass uart_puts() einen Zeiger erwartet:

   void uart_puts (char *s)

Aber hier wird mit *s der Zeiger derefenziert, d.h. auf den Wert 
zugegriffen, worauf der Zeiger zeigt:

   uart_putc(*s);

Das passt dann auch mit der Definition von uart_putc():

   int uart_putc(unsigned char c)

wo klar angegeben ist, dass uart_putc() keinen Zeiger, sondern ein 
Zeichen erwartet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.