Forum: Mikrocontroller und Digitale Elektronik String leeren?


von Helge (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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.

von Bernhard Koopmeiners (Gast)


Lesenswert?

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

von Helge (Gast)


Lesenswert?

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.

von Khani (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von neo (Gast)


Lesenswert?

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

von Helge (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.