AVR: USART und Strings im RXIE-Modus

Gast #1337940
Hallo zusammen,

"ich gerne ein Problem": Und zwar hab ich hier eine App laufen die ich 
übern USART steuern möchte ( RS232 ), das mit dem USART ist ja nicht das 
Problem, der läuft schön braf auch über die USB ( virtual-com ), 
zumindest was das senden vom AVR betrifft. Jetzt ist es so das in meinem 
Programm ne ganze menge kritischer sachen laufen die man aber für ein 
paar µS für Interrupt unterbrechen kann. Jetzt möchte ich das wenn ein 
Char über den USART an meinen AVR kommt der "zwischengespeichert" wird 
bis, wenn der nächste kommt das selbe in grün, bis das schluss-zeiche ( 
\r bzw CR ) kommt. Jetzt die frage wie man das am sinnvollsten löst: Ich 
reiße den AVR bei einem RX in die RXI-Routine, save dort mein Char, egal 
was für eins. Warte bis ich in meiner main mal wieder das recht auf 
datenverarbeitung hab ;-) und schaue nach ob im String nen \r vorkommt. 
Oder sollte ich dsa schon in der Interrup prüfen und dann nen Bit 
setzten das was da ist und in der main dann einfach das bit abfragen und 
die Daten verarbeiten?

Wie gesagt die daten kommen vom PC übern usart und sehen so aus "$SD\r" 
als beispiel.

Grüßle lightninglord
Gast
Hi

ich würde alle Zeichen vom UART in einem Fifo zwischenspeichern und 
zyklisch einen Automaten aufrufen, der das Fifo liest, umkopiert und auf 
Endzeichen prüft. Hiermit kann man dann einen 'command-scanner' füttern.

Durch die Fifo-Pufferung sind hohe Datenraten möglich, ohne dass etwas 
verloren geht.
Gast
Das mit dem FiFo hört sich gut an, das mit den Datenraten ist egal, ich 
arbeite mit 9600 und da kommt auch nur alle paar sec bzw min was, das 
dürfte nicht so schlimm sein. Hat mir vlt einer nen Codeschnippsel fürn 
FiFo man muss ja das Rad nich neu erfindn, anpassen dürfte ja ábsolut 
kein problem sein.
Gast
Habe mir selbst ne UART lib geschrieben mit Ringbuffer als fifo (sowohl 
Empfangs- als auch Senderichtung)
Dh das Umkopieren passiert im Hauptprogramm, der Rest nur in den 
UART-Interrupts. Funktioniert prima. Man kann sie auch so einstellen, 
dass bei vollem Ringbuffer blockiert oder überläuft. Das macht Sinn, 
wenn man z.B. auf einmal viel senden will, und die UART nicht 
hinterherkommt
Bei Interesse poste ich das mal bei Gelegenheit, wird aber vermutl. erst 
nächste Woche was.
Gast
so, da isser wieder, leider jedenfalls. Es ist ein Problem aufgetaucht:

Der FiFo wurd von der Wiki übernommen und funktioniert nach der 
anpassung an mein programm ( in nen usart.c gelegt und header angepasst, 
mehr nicht ) auch wunderprächtig, jedenfalls wenn ich alles was im 
Puffer ist wieder aufn USART hau ( praktisch die Software-Drahtbrücke 
zw. Rx und Tx ;-) ) nur wenn ich den Puffer in nen String kopieren will 
und diesen vergleichen möchte dann geht das nicht, ich nehme an das ich 
mit den Pointern nen gewurstel drin hab, aber leider finde ich den 
Fehler nicht, hab schon etwas rumgespielt, aber "leider nein".

1
 
2
  #include <avr/pgmspace.h>
3
  #include <string.h>
4
  
5
  U8 rxpuf[16];
6
    
7
  while(USARTBufferOut(rxpuf)) ;
8
    
9
  if (strncmp_P ( rxpuf, PSTR("$"), 1) == 0) OutChar('O');

Das mit den Zeigern kann manchmal echt verwirrend sein.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.