Hallo Ich habe ein Problem mit einer Zeichenkette.Über den Int der USART empfange ich einige Zeichen die im rx_buffer1 landen.Diese werte ich aus.Soweit klappt es auch.Kommen jedoch die nächsten Zeichen (ca 10sec später) klappt das mit der nächsten Auswertung nicht richtig wenn die Zeichenkette kürzer ist als die vorige.Nach einem Reset geht das.Jetzt dachte ich den rx_buffer1 nach der Auswertung zu leeren.Hab da ne lustige Sache gebastelt (die wohl eher peinlich ist) die sogar funktioniert.Hat noch jemand ne Idee wie das einfacher geht? -------------------------------------------------------------------- leeren() { strcpy(rx_buffer1,rx_buffer1); //Kopie zur Erzeugung der /0 i=0; while(rx_buffer1[i]!=0) //rx_buffer1 mit 0 überschreiben { rx_buffer1[i]=0;i++; } rx_wr_index1=0; rx_rd_index1=0; rx_counter1=0; i=0; } --------------------------------------------------------------------- Gruß Helge
Da dein String nullterminiert ist, könntest du doch beim Einlesen einfach an die aktuelle Schreibstelle eine "0" schreiben. Beim nächsten empfangenen Zeichen wird die "0" mit dem Zeichen überschrieben und in die nächste Position eine "0" geschrieben. So kannst du immer feststellen, ob dein String zuende ist.
Hallo Helge, schön wenn Dein rx_buffer1 irgendwo eine 0 hat. Ansonsten geht die while-Schleife in die Hose. Also immer Abbruchbedingung einarbeiten. Wenn Du im Interrupt ein Byte empfängst, setzt Du den Zeiger fürs nächste Zeichen. Dieses solltest Du dann sofort auch auf 0 setzen. Ich gehe einmal davon aus, dass Du keinen Rinbuffer nutzen wolltest. Bernhard
Danke für die schnellen Antworten. Ich empfange ein PDU String vom Handy und benötige den ganzen buffer1.Der hat bei mir 200 zeichen. Das ist bestimmt auch keine so gute Lösung.Aber es funktioniert sehr gut so. mit der Zeile: strcpy(rx_buffer1,rx_buffer1); will ich ja bezwecken, daß die 0 am Ende entsteht, was ja beim Empfang über der USART nicht passiert.Das Programm hat sich an dieser Stelle glücklicherweise noch nicht aufgehangen. Wichtig ist für mich,daß nach der Auswertung der buffer1 komplett leer ist und der Zeiger auf Stelle null zeigt für den nächsten Empfang.
Einige Anmerkungen : - Was hindert Dich daran, einfach den Buffer 1 Zeichen länger zu machen, dann kann man in die 201.te Stelle immer die '0' reinschreiben. Ansonsten ist die strcpy-Zeile schon recht gewagt ;-) - Wenn Dein Puffer immer 200 Zeichen hat, dann mach doch aus der while-Schleife eine for-Schleife : const BUFFER1_LENGTH = 200; ... for (unsigned char i=0; i<BUFFER1_LENGTH; rx_buffer1[i++]=0); Mit der Konstante hat man dann die Länge auch schnell angepasst, wenn es mal nötig ist. - Dass der Pointer auf die nullte Stelle des String zeigt, ist eh kein Problem, wenn man über die brackets ('[]') drauf zugreift. Man sollte eh für jedes Array auf das man pointert einen Pointer auf den Anfang haben (oder halt einen Zähler der nur für den Zweck dieses Arrays verwendet wird). - Der strcpy-Befehl verplempert nur Rechenzeit, wenn man ihn dazu einsetzt, aber Rechenzeit ist meist eh egal, wenn man nicht an einer Batterie hängt und immer gerne schläft. ;-) MfG, Khani
Hallo Helge! Wie stellst du eigentlich fest, dass dein String zuende ist? Wenn Du das weisst, dann würde dein "rx_wr_index1" eh auf die letzte Stelle zeigen und du wüsstest, wann der Sring zuende ist (rx_rd_index1 == rx_wr_index1).
wenn rx_buffer immer klomplett auf NULL gesetzt werden soll dann memset( rx_buffer, 0, sizeof( rx_buffer)); noch einfacher als for oder while vs
Hallo Danke euch erst mal.Das mit der for-Schleife ist natürlich absturzsicherer.Ist mir nicht eingefallen:-( Die Lösung mit memset( rx_buffer, 0, sizeof( rx_buffer)); finde ich super.Der Befehl memset war mir nicht bekannt.Das probiere ich heute Abend gleich mal aus. Zu Rahul: "Wie stellst du eigentlich fest, dass dein String zuende ist?" Das ist ne gute Frage.Habe am Programm 1/2Jahr nichts gemacht.Dann sitzt man wieder davor und "guckt nur".Im PDU String ist ja die Textlänge angegeben.Diese Länge lese ich dann aus dem buffer aus. Gruß Helge
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.