RS232 verlorene Zeichen

Gast #429780
Lesenswert?

Ich habe ein kleines Problem mit der seriellen Kommunikation. Mit einem 
kleinen C Programm versuche ich einen Satz an meinen ATmega16 zu senden. 
Dort wird dann das empfangene auf einem LCD Display angezeigt

ISR(USART_RXC_vect)
{
  lcd_putchar(UDR);
}

Wenn ich mit HyperTerminal über "Textdatei senden..." gehe, dann kommt 
der ganze Satz an.
Send ich es über mein C Programm werden teilweise Zeichen "verschluckt". 
Lässt sich das irgendwie verhindern?

Hier meine C Funktion:
unsigned long bytes_written;
char test[] = "Eine Kuh macht MUH, ja eine Kuh die macht ganz gerne MUH 
!!";
WriteFile(serial_port, (void*)&test, strlen(test), &bytes_written, 
NULL);
Gast #429801
Lesenswert?

Dein lcd_putchar wird zulangsam für die Verwendung innerhalb einer ISR 
sein.
Sammle die eingehenden Zeichen in einem Puffer und setze ein Flag, dass 
ein Zeichen empfangen wurde.
In deinem Hauptprogramm wird dann abgefragt, ob das Flag gesetzt ist 
oder nicht.
Ist es gesetzt, wird solange lcd_putchar mit dem aktuellen Zeichen 
aufgerufen, bis keins mehr im Puffer ist.
(Firma: Promaxx.net) #429802
Lesenswert?

Na, da wird die Ausgabe eines Zeichens auf das LCD wohl teilweise mehr 
Zeit benötigen, als die Übertragung durch den UART.

Die ISR sollte einfach nur einen kleinen Ringbuffer (16 oder 32 Zeichen) 
füllen, und im Hauptprogramm eine Routine diese Zeichen wieder auslesen 
und ausgeben.
In der ISR kann man dann evtl. den Sender bremsen per Handshake.
Gast #429804
Lesenswert?

Pause bringt was, ja. Aber lässt sich das nicht ohne Pause so regeln, 
dass nichts verloren geht?
Ich habe einen 7.3728 MHz Quarz der auch läuft. Im Moment ist die 
Übertragungsgeschwindigkeit 9600 bps, mit 115.2k fehlen einfach mehr 
Zeichen.

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