www.mikrocontroller.net

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


Autor: Bernd Bömer (behbeh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//
// Status: Kompiliert + Simuliert 
//
#include <avr/io.h>

#define NOSIM 0

#if NOSIM
#define lcdInit()
#define uart0Init()
#define uartReceiveByte(a,b)  1
#define lcdPrintData(a,b)
#else
#include "avrlib/lcd.h"
#include "avrlib/uart2.h"
#endif

#define UART0      0
#define MAXEINGABE 20

unsigned char eingabe[MAXEINGABE];
unsigned char rxData;
unsigned char i;          
unsigned char zeilenende; 

int main(void)
{
  lcdInit();
  uart0Init();

  while(1)
  {
    if(uartReceiveByte(UART0, &rxData))
    {
      // Noch Platz im Zeilenpuffer?
      if (i >= MAXEINGABE-1)
        i = 0;

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

      // Puffer stets abschliessen
      eingabe[i] = '\0';
    }

    if (zeilenende)
    {
      // Zeile Auswerten und Werte anzeigen
      // "$BM,123.001 m"
      // Strategie: String zwischen Komma und Leerzeichen 
      //            herausoperieren (Mit Nullbyte klammern) 
      //            und anzeigen (Quick & Dirty)
      unsigned char *s = eingabe;
      unsigned char *pzahlstring = 0;
      unsigned char nbytes;

      while(*s)
      {
        if (*s == ',') 
        {
          *s++ = '\0';
          pzahlstring = s;
          nbytes = 0;
        } 
        else if (*s == ' ' && pzahlstring) 
        {
           *s = '\0';
           lcdPrintData(pzahlstring, nBytes);
           // *s auf '\0' stehenlassen => Ende von while
        }
        else
        {
           nbytes++;
           s++;
        }
      }

      // Auswertung fertig. Eingabe löschen
      i = 0;
      eingabe[i] = '\0';
      zeilenende = 0;
    }
  } // forever
} // main


Autor: Bernd Bömer (behbeh)
Datum:

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

Bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.