www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232 verlorene Zeichen


Autor: Peter W. (Gast)
Datum:

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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde es etwas bringen, wenn nach jedem gesendeten Zeichen eine kleine

Pause von wenigen ms eingelegt wird?

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft der ATMega mit einem Quarz oder dem internen Oszillator? Letzteres 
könnte durchaus eine Ursache für ein solches Problem sein.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

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

Autor: Peter W. (Gast)
Datum:

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

Autor: Peter W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war ich schon zu langsam mit Antworten :D

Ich werde das mit dem Puffer mal testen.

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.