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
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
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.
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.
wer die Wiki liest ist klar im vorteil, soviel zum Thema Codschnippsel ;-)
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.