mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String leeren?


Autor: Helge (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Bernhard Koopmeiners (Gast)
Datum:

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

Autor: Helge (Gast)
Datum:

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

Autor: Khani (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: neo (Gast)
Datum:

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

Autor: Helge (Gast)
Datum:

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

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.