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


von lightninglord (Gast)


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

von spess53 (Gast)


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

von Flachmann (Gast)


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.

von lightninglord (Gast)


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.

von lightninglord (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Sumynona (Gast)


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.

von lightninglord (Gast)


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

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.

von lightninglord (Gast)


Lesenswert?

Problem erkannt, Problem gebannt, danke für eure tipps

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.