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

OP #751009
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
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

Eine eigene Frage? Dieser Thread ist über 18 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.