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
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.