Procyon AVRlib , wie kann ich hiermit eine String vom UART e

#751009
Lesenswert?

Hallo,
ich benutzt die Libary von Procyon AVRlib
ich habe fast alle Function schon getestet. Klappt prima, nur jetzt
komme ich nicht weiter, ich muss einen String über UART0 einlesen und 
Zahlen daraus auf einem Display darstellen. Die Displayansteuerung 
klappt über SPI. Ein zeichen kann ich auch einlsen, nur so einen String 
mit ca 12..14 Zeichen, keine Ahnung wie das geht mit der Lib. Hat jemand 
eine Idee?
Habe schon diverse suchen gemacht heier im forum, im Prinzip habe ich 
auch Teile verstanden, aber was funktioniert, habe ich noch nicht zu 
Stande gebracht.
Der String vom Messgeaet sieht so aus: "$BM,123.001 m" Die Zahlen sollen 
aufs LC Display erscheinen.
Vielen Dank fuer die Hilfe im Voraus...
Bernd
Persönliche Seite #751340
Lesenswert?

1
//
2
// Status: Kompiliert + Simuliert 
3
//
4
#include <avr/io.h>
5

6
#define NOSIM 0
7

8
#if NOSIM
9
#define lcdInit()
10
#define uart0Init()
11
#define uartReceiveByte(a,b)  1
12
#define lcdPrintData(a,b)
13
#else
14
#include "avrlib/lcd.h"
15
#include "avrlib/uart2.h"
16
#endif
17

18
#define UART0      0
19
#define MAXEINGABE 20
20

21
unsigned char eingabe[MAXEINGABE];
22
unsigned char rxData;
23
unsigned char i;          
24
unsigned char zeilenende; 
25

26
int main(void)
27
{
28
  lcdInit();
29
  uart0Init();
30

31
  while(1)
32
  {
33
    if(uartReceiveByte(UART0, &rxData))
34
    {
35
      // Noch Platz im Zeilenpuffer?
36
      if (i >= MAXEINGABE-1)
37
        i = 0;
38

39
      // Zeilenende gefunden (muss kommen! ggf. anpassen)?
40
      if (rxData == '\n')
41
        zeilenende = 1;          // Ja: Eingabe ist fertig
42
      else
43
        eingabe[i++] = rxData;   // Nein: Zeichen zur Zeile hinzufügen
44

45
      // Puffer stets abschliessen
46
      eingabe[i] = '\0';
47
    }
48

49
    if (zeilenende)
50
    {
51
      // Zeile Auswerten und Werte anzeigen
52
      // "$BM,123.001 m"
53
      // Strategie: String zwischen Komma und Leerzeichen 
54
      //            herausoperieren (Mit Nullbyte klammern) 
55
      //            und anzeigen (Quick & Dirty)
56
      unsigned char *s = eingabe;
57
      unsigned char *pzahlstring = 0;
58
      unsigned char nbytes;
59

60
      while(*s)
61
      {
62
        if (*s == ',') 
63
        {
64
          *s++ = '\0';
65
          pzahlstring = s;
66
          nbytes = 0;
67
        } 
68
        else if (*s == ' ' && pzahlstring) 
69
        {
70
           *s = '\0';
71
           lcdPrintData(pzahlstring, nBytes);
72
           // *s auf '\0' stehenlassen => Ende von while
73
        }
74
        else
75
        {
76
           nbytes++;
77
           s++;
78
        }
79
      }
80

81
      // Auswertung fertig. Eingabe löschen
82
      i = 0;
83
      eingabe[i] = '\0';
84
      zeilenende = 0;
85
    }
86
  } // forever
87
} // main

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren