AVR mit ASM --> RS232 mit Interrupt / Buffer

Gast #5064939
Lesenswert?

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
Lesenswert?

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
Lesenswert?

@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.

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