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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.