mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur seriellen Eingabe (Buffer)


Autor: Thomas P. (newi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich habe mal eine Frage an euch. Den unten stehenden Code verwende ich 
um Zeichenketten einzulesen. Meine Frage, wie kann ich aus dem ZEiger 
*Buffer nun meine eingelesene Zeichenkette weiterverarbeiten?
Ich habe vor Telefonnummern und deren zugehöhrige Daten in ein Array zu 
speichern. ...Fang mal klein an, mit einer Nummer. Ich habe aber keine 
Ahnung wie ich diese nach dem Einlesen in eine Variable speichern kann.

Wäre echt gut wenn mir hier einer auf die Sprünge helfen kann!
Danke
/* Zeichen empfangen */
uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}



void uart_gets1( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;
 
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
 
                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen kam
                                  // * oder das aufnehmende Array voll ist
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }
 
                                  // Noch ein '\0' anhängen um einen Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';

}

Autor: Thomas P. (newi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir keiner helfen?

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoi.

Du liest einzelne Zeichen vom Typ char ein. Ein String ist im Prinzip 
nur ein Chararrey. Wenn du nun diese Strings Speicheren möchtest, 
erstellst du ein Pointerarray ( char*array[anzahl der nummern] ). Da 
kannst du dann deine Strings mit strcpy() reinkopieren:

    char*string;
    char*stringarray[1];
    string="Hallo\0";
    strcpy(stringarray[0],string);

Wenn du die einzelnen Zeichen in Integerwerte umrechnen möchtest, musst 
du von deinem Zeichen das Zeichen '0' abziehen. Damit hast du dann den 
Dezimalwert. Nun musst du diesen mit 10^(Anzahl Stellen - Stelle des 
Zeichens im String) multiplizieren und hinterher Aufsummieren.

...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt der Aufruf der Einlesefunktion. Diese Aufruferfunktion hat 
mehrere Jobs:

1/ Ggf. einen ausreichend Puffer grossen bereitstellen (wenn es kein 
globaler Puffer ist) und dessen Adresse und Fassungsvermögen zum 
Befüllen an die Einlesefunktion übergeben.

2/ Den ggf. gefüllten Puffer auseinanderschnippeln. Wie zu schnippeln 
ist, hängt von den darin befindlichen Daten ab.

Beispiel #1

Name Vorname +123456789

wäre schwieriger zu schnippeln (Neumann Alfred E. +123456789) als

Beispiel #2

NAME="Name", VORNAME="Vorname", NUMMER="+123456789"

Bei Beispiel #2 kännte man sich auf Trennzeichen (,) stützen und den 
Text zwischen den "" den enstprechenden Feldern (dem Text vor dem =) 
zuordnen.

Funktionen zum Auseinanderschneiden von Strings finden sich in der Doku 
zur Headerdatei /strings.h/ oder in der Forensuche mit strtok and 
friends.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bla schrieb:
> Hoi.
>
> Du liest einzelne Zeichen vom Typ char ein. Ein String ist im Prinzip
> nur ein Chararrey. Wenn du nun diese Strings Speicheren möchtest,
> erstellst du ein Pointerarray ( char*array[anzahl der nummern] ). Da
> kannst du dann deine Strings mit strcpy() reinkopieren:
>
>     char*string;
>     char*stringarray[1];
>     string="Hallo\0";
>     strcpy(stringarray[0],string);


Autsch.
So auf keinen Fall!

Du kannst nicht einfach Pointer benutzen um dorthin zu schreiben wie du 
lustig bist. Du brauchst am Ziel schon auch reservierten Speicher!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas P. schrieb:

> um Zeichenketten einzulesen. Meine Frage, wie kann ich aus dem ZEiger
> *Buffer nun meine eingelesene Zeichenkette weiterverarbeiten?

Merke:
nur weil die Funktion einen Pointer als Argument bekommt, heißt das 
nicht, das der Aufrufer nur eine Pointervariable benötigt.

Du musst deine Funktion uart_gets1 so benutzen
int main()
{
  char KompletteZeile[80];    // Annahme: es werden nicht mehr als 80 Zeichen gebraucht

  ...

  uart_getsl(  KompletteZeile, sizeof( KompletteZeile ) );

  ...
  // ab hier hast du dann den String im Array vorliegen und kannst mit
  // den C-Stringfunktionen darauf arbeiten
}

Siehe auch
http://www.mikrocontroller.net/articles/FAQ#Wie_fu...
für eine kurze Einführung in Stringverarbeitung. Näheres und wesentlich 
umgfangreicheres weiß dein C-Buch darüber zu berichten

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> bla schrieb:
>> Hoi.
>>
>> Du liest einzelne Zeichen vom Typ char ein. Ein String ist im Prinzip
>> nur ein Chararrey. Wenn du nun diese Strings Speicheren möchtest,
>> erstellst du ein Pointerarray ( char*array[anzahl der nummern] ). Da
>> kannst du dann deine Strings mit strcpy() reinkopieren:
>>
>>     char*string;
>>     char*stringarray[1];
>>     string="Hallo\0";
>>     strcpy(stringarray[0],string);
>
>
> Autsch.
> So auf keinen Fall!
>
> Du kannst nicht einfach Pointer benutzen um dorthin zu schreiben wie du
> lustig bist. Du brauchst am Ziel schon auch reservierten Speicher!

Guck doch mal genauer hin verdammt. Zwischen string="Hallo\0" und strcpy 
steht doch eindeutig
stringarray[0]=(char* )malloc(strlen(string)*sizeof(char))

:-D (langen Tag gehabt)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bla schrieb:
>
> Guck doch mal genauer hin

Ich hab schon genauer hingesehen (das ist aber auch klein gedruckt :-)

> verdammt.

Die einzige Sprache, die alle Programmierer perfekt beherrschen: fluchen

> Zwischen string="Hallo\0" und strcpy
> steht doch eindeutig
> stringarray[0]=(char* )malloc(strlen(string)*sizeof(char))

Und wenn man ganz genau schaut, dann fehlt da ein +1
(dafür ist da ein Cast, der in C besser nicht da wäre :-)


> :-D (langen Tag gehabt)

LOL,

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.