Stringverarbeitung mit AVR

Gast #1198169
Guten Abend zusammen.

Seit einigen Tagen versuche ich, eine RS232-Schnittstelle für eine 
Kaffeemaschine zu basteln. Das ganze ist Teil eines Schulprojektes, wo 
es darum geht, den Kaffeekonsum in einer Firma zu erfassen und eine 
bargeldlose Bezahlmöglichkeit zu realisieren. Dies ist mein erstes 
Projekt mit AVRs

Aber bereits beim Befehle auswerten hapert es. Das Ding macht nicht das 
was es sollte/ich will.

Der UART selbst geht, das hab ich durch ein lokales Echo-Testprogramm 
auf dem AVR getestet.

Nur das strcmp-verzweigungs-konstrukt treibt mich in den Wahnsinn. 
Irgendwie blick ich da noch nicht so ganz durch.

Könnte mir da bitte jemand sagen welch groben Fehler ich da begangen 
habe?

Kompiliert wird mit AVR-GCC.

Danke im Voraus,

shpank
Angehängte Dateien:
ich hab's nur kurz überflogen, aber in recvstr() machst Du einen groben 
Fehler!
1
void recvstr(unsigned char * text)
2
{
3
  unsigned int next;
4
    unsigned char * tmp;
5
  text = tmp;                             
6
    do
7
  {
8
    next = USART_Receive();
9
      *tmp++ = next;
10
    }while( next != '\r');
11

12
    *tmp = '\0';
13
}

Zeiger angelegt, aber keinen Speicher => Du schreibst deine Sachen 
irgendwo hin, kann gut gehen, aber idR macht das nur Probleme.

C-Buch Stichwörter: Zeiger, Array, malloc
Gast
Wäre es für den Anfang vielleicht besser, das ganze mit einem großen 
char-Array mit fixer größe zu machen, wo ich einfach alles reinschreibe?

Tut mir leid wenn ich euch auf den Wecker gehe. So wirklich viel Ahnung 
hab ich von dem Zeugs hier noch nicht, da ich aus der schönen bunten 
Welt der objektorientierten Programmierung (C#, Java) komme.
Ja, mach dir nen kleinen Zeilenpuffer (so klein wie möglich, aber so 
groß wie nötig) und schreib da rein.

Irgendwie sowas in der Art:
1
char zeile[32];
2

3
void recvstr()
4
{
5
  int i;
6
  char c;
7

8
  for(i=0; i<(32 - 1); i++)
9
  {
10
    c = usart_getc();
11

12
    // Zeilenende erreicht?
13
    if(c == '\r')
14
    {
15
      // ja: dann String terminieren
16
      zeile[i] = '\0';
17
      break;
18
    }
19
    else
20
    {
21
      // nein: empfangenes Zeichen anhängen
22
      zeile[i] = c;
23
  }
24

25
  zeile[31] = '\0';   // zwingende Terminierung
26
}

MfG
Marius
Gast
Danke Marius!

Ich werd das heute mal ausprobieren.

gibts sonst noch grobe fehler? jaja... ich weiß, meine main-methode 
sieht grauenhaft aus. das kommt vom rumfrickeln. das werd ich heute noch 
bereinigen.

schönen sonntag noch.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.