www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: USART und Strings im RXIE-Modus


Autor: lightninglord (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich würde in der ISR ein Flag setzen, wenn das Endezeichen kommt. Das 
Suchen in einem String dürfte zeitaufwendiger sein.

MfG Spess

Autor: Flachmann (Gast)
Datum:

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

Autor: lightninglord (Gast)
Datum:

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

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wer die Wiki liest ist klar im vorteil, soviel zum Thema Codschnippsel 
;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lightninglord schrieb:
> wer die Wiki liest ist klar im vorteil, soviel zum Thema Codschnippsel
> ;-)

Entweder das oder man holt sich vom Peter Fleury die UART Lib.
Das ist das schon fertig eingebaut.

Autor: Sumynona (Gast)
Datum:

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

Autor: lightninglord (Gast)
Datum:

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

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


Das mit den Zeigern kann manchmal echt verwirrend sein.

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem erkannt, Problem gebannt, danke für eure tipps

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.