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);
Würde es etwas bringen, wenn nach jedem gesendeten Zeichen eine kleine Pause von wenigen ms eingelegt wird?
Läuft der ATMega mit einem Quarz oder dem internen Oszillator? Letzteres könnte durchaus eine Ursache für ein solches Problem sein.
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.
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.
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.
Da war ich schon zu langsam mit Antworten :D Ich werde das mit dem Puffer mal testen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.