Forum: Mikrocontroller und Digitale Elektronik Stringverarbeitung mit AVR


von shpank (Gast)


Angehängte Dateien:

Lesenswert?

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

von P. S. (Gast)


Lesenswert?

Schon recvstr() ist ziemlicher Unsinn. Mal in ein C-Buch geguckt?

von Mano W. (Firma: ---) (manow)


Lesenswert?

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

von shpank (Gast)


Lesenswert?

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.

von Marius W. (mw1987)


Lesenswert?

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

von shpank (Gast)


Lesenswert?

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.

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.