Forum: Mikrocontroller und Digitale Elektronik UART String senden - Funktionsfrage


von Jakob (Gast)


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 :(

von Huch (Gast)


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.

von Huch (Gast)


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.

von Jakob (Gast)


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

von Huch (Gast)


Lesenswert?

Ach so.

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

von Huch (Gast)


Lesenswert?

Genauer muss es heissen:

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

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.