mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART String senden - Funktionsfrage


Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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?
/* ATmega16 */
int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
}
 
 
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

Ich habe keine Debugger und kann es nicht richtig testen :(

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
    
    UDR = c;                      /* Zeichen in das Senderegister */
    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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so.

Ja. Wenn uart_putc zurückkehrt dauert es noch eine Framelänge bis das 
Zeichen raus ist.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genauer muss es heissen:

Wenn uart_putc zurückkehrt dauert es noch mindestens eine Framelänge 
bis das Zeichen raus ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.