Forum: Mikrocontroller und Digitale Elektronik Procyon AVRlib , wie kann ich hiermit eine String vom UART e


von Bernd B. (behbeh)


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

von Stefan B. (stefan) Benutzerseite


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

von Bernd B. (behbeh)


Lesenswert?

Hallo Stefan,
klappt prima deine routine...
Nochmals vielen Dank auch im namen der wissenschaft!

Bernd

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.