Forum: Mikrocontroller und Digitale Elektronik Frage zu UART Tutorial


von Hans M. (lukem)


Lesenswert?

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
}

von spess53 (Gast)


Lesenswert?

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

von M. K. (sylaina)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

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.