UART String senden - Funktionsfrage

Gast #2049027
Lesenswert?

Hallo! Ich habe eine Frage zum Senden von Strings über UART.

Angenommen ich sende einen String mit der Länge von genau 100 Zeichen.
Wird die Funktion
1
void uart_puts (char *s)
 solange ausgeführt, bis tatsächlich 100 Zeichen gesendet wurden, oder 
nur solange bis das 100te Zeichen in das Sende-Schiebe-Register 
übertragen wurde?
Anders formuliert:
Wird die Funktion bereits verlassen, obwohl noch ein Zeichen gesendet 
wird?
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" */
18
        uart_putc(*s);
19
        s++;
20
    }
21
}

Ich habe keine Debugger und kann es nicht richtig testen :(
Gast #2049053
Lesenswert?

Die Funktion uart_putc kehrt zurück, sobald

> das 100te Zeichen in das Sende-Schiebe-Register übertragen wurde

Das kannst Du am Code sehen.
1
    
2
    UDR = c;                      /* Zeichen in das Senderegister */
3
    return 0;

Der Kommentar ist nun korrekt(er).

Im allgemeinen ist das nicht von Bedeutung, aber Du kannst ja mal den 
Grund Deiner Anfrage schildern. Vielleicht kann man Dir weiterhelfen.
Gast #2049056
Lesenswert?

Genau genommen ist meine Antwort nur für gewisse UART-Implementierungen 
wahr.
Beim AVR ist das UDR (so heisst es dort) nicht das 
Sende-Schieberegister sondern das Sendedaten-Buffer-Register. Das 
Zeichen wird erst von dort in das eigentliche Sende-Schieberegister 
übertragen sobald bzw, falls es leer ist.
Details sind im Datenblatt zu erkennen.
Gast #2049295
Lesenswert?

Ich habe die Dauer der uart_putc(*s); oszillografiert und eine 
Abweichung von einer Zeichenzeit festgestellt, da aber kein Zeichen 
verloren ging, habe ich die Frage gestellt. Danke für deine Antwort

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren