AVR mit ASM --> RS232 mit Interrupt / Buffer

Gast #5064939
Hallo, ich habe mal eine Frage zu diesem Artikel und dem Listing:

https://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Empfangen_von_Zeichen_per_Interrupt

Angenommen ich sende zehn Zeichen, dann müssten ja auch zehn Interrupts 
ausgelöst werden.



Wie realisiere ich aber einen Empfangsbuffer zur Aufnahme der Zeichen, 
wenn die Zeichenanzahl an sich unbekannt ist. Sie ist halt >0 und <50. 
Also variabel. Soviel kann ich sagen. Für die max. 49 Zeichen ist 
Speicher im SRAM vorhanden.

Also die Zeichen werden empfangen, zwischengespeichert und wenn z.B. 100 
ms nichts mehr passiert, dann soll der Buffer abgearbeitet werden. Die 
Baudrate ist maximal 115K und Minimal 9K6. Da müssten 100 ms Wartezeit 
wohl reichen - oder?

Cheffe_von_Nix
Gast #5064954
Also ich weiss nicht was schlimmer ist: ein Timeout oder ein CR/LF 
abwarten...
Für Dich ist das mit dem Timeout fast vernünftiger...
Bis jetzt habe ich CR/LF benutzt, und die String-Empfangsroutine 
benutzt. Oder aber manuell ein Flag gesetzt, um nicht unnötig Ressourcen 
zu verschwenden....

Gruss Chregu
#5064956
@Cheffe_von_Nix (Gast)

>Angenommen ich sende zehn Zeichen, dann müssten ja auch zehn Interrupts
>ausgelöst werden.

Wenn deine ISR schnell genug ist und bei jedem Aufruf nur ein Zeichen 
liest, dann ja. In diesem Beispiel ganz sicher, weil es keine anderen 
Interrupts gibt.

>Wie realisiere ich aber einen Empfangsbuffer zur Aufnahme der Zeichen,
>wenn die Zeichenanzahl an sich unbekannt ist.

Dazu baut man einen FIFO in Software. Dort schreibt der Interrupt 
die Zeichen rein, solange noch mindestesn ein Zeichen frei ist. Wenn 
nicht, muss das Zeichen weggeworfen werden und sinnvollerweise ein FIFO 
Überlauf signalisiert werden.

>Also die Zeichen werden empfangen, zwischengespeichert und wenn z.B. 100
>ms nichts mehr passiert, dann soll der Buffer abgearbeitet werden.

Kann man machen, muss man aber nicht. Besser ist es, die Abarbeitung zu 
starten, wenn entweder mindestens N Zeichen im Puffer sind oder ein 
spezielles Zeilenendezeichen empfangen wurde.
Timeouts sind hier nur die zweitbeste Lösung, u.a. weil sie 
baudratenabhängig sind.
Gast #5065105
Hallo, vielen Dank. Ich habe herausgefunden, dass immer ein ";" am Ende 
kommt. Kein CR/LF oder so. Das kann ich dann ja abfangen.


Gruß
Cheffe_von_Nix
#5065243
Hi

Das 'riecht' dann aber danach, daß die Werte, die davor übertragen 
werden, in 'menschen lesbarer Form' übertragen werden - sonst könnte ein 
';' nämlich auch ein normales Byte sein.

Wobei Das dann wohl eher in den Bereich 'Verarbeitung' gebraucht wird.

MfG

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.