Moin Moin, ich versuche gerade, die D0 Schnittstelle eines Easymeters auszulesen und die Daten in lesbarer Form auf ein LCD Display zu bekommen. Ich nutze dafür einen PIC18F25K22 und ich bin mit der Eusart so weit, dass ich saubere Signale reinbekomme. Die Daten vom Easymeter sehen ungefähr so aus und werden alle 2 Sekunden mit 9600 Baud als ASCII gesendet: /ESY5Q3DA2056 V3.01 1-0:0.0.0*255(1050000650) 1-0:1.8.0*255(00000000.4500000*kWh) 1-0:21.7.255*255(000030.00*W) 1-0:41.7.255*255(000250.00*W) 1-0:61.7.255*255(000070.00*W) 1-0:1.7.255*255(000350.00*W) 1-0:96.5.5*255(62) 0-0:96.1.255*255(1ESY1050000565) ! Das "/" kennzeichnet den Anfang und das "!" das Ende des Datenpaketes. Nach dem Senden ist für über eine Sekunde Pause, wo die LCD Darstellung erfolgen könnte. Die Zeilen 2-6 geben in den Klammern die aktuellen Leistungswerte in Watt an und nur diese sind für mich interessant. Leider können die Datenpakete unterschiedlich lang sein, so dass ich keinen Zähler mitlaufen lassen kann. Außerdem kommt die Eusart nach ein paar empfangenen Zeichen außer Tritt, wenn ich die Daten nach jedem empfangenen Zeichen gleich auf das LCD packen möchte. So, nun kommt endlich meine Frage: Wie kann ich die empfangenen Daten in ein String Array packen und nachdem der Empfang abgeschlossen ist, wieder auslesen? Wie muß so ein Array in C deklariert werden und wie kann es beschrieben und ausgelesen werden? Ich hatte erst im letzten Jahr als "alter Assembler Sack" mit C angefangen und kann im Moment erst die groben Grundsachen. Ich hoffe, dass hier auch ein paar Pic Benutzer dazwischen sind... Vielen Dank im Voraus! Viele Grüße aus dem Norden Axel
:
Verschoben durch Admin
Axel Joost schrieb: > Leider können die Datenpakete unterschiedlich lang sein, so dass ich > keinen Zähler mitlaufen lassen kann. Außerdem kommt die Eusart nach ein Du musst nur etwas anderes als Zeichen zählen. Z.B.: "Finde zweite Zeile" -> "Finde Punkt" -> "8 Zeichen davor und 7 Zeichen danach sind mein Wert". > paar empfangenen Zeichen außer Tritt, wenn ich die Daten nach jedem > empfangenen Zeichen gleich auf das LCD packen möchte. Empfang, Auswertung und Ausgabe am bestens getrennt behandeln und schon gar nicht im selben Interrupt. Der dauert sonst so lange, dass du welche versäumst. Modulare Konzepte sind immer wünschenswert. > So, nun kommt endlich meine Frage: Wie kann ich die empfangenen Daten in > ein String Array packen und nachdem der Empfang abgeschlossen ist, > wieder auslesen? Wie muß so ein Array in C deklariert werden und wie Welchen Compiler benutzt du? Kennt der überhaupt strings? Aber du brauchst sowieso nur ein Zeichen-Array. Dieses Zeichen-Array befüllst du im Interrpt und wertest es in deiner main-Funktion wie in der oben beschriebenen "Suche" aus.
1 | volatile char receive_buffer[512]; |
2 | |
3 | #pragma interrupt
|
4 | void eusart_interrupt(void) |
5 | {
|
6 | static short counter = 0; |
7 | receive_buffer[counter] = RCREG0; |
8 | counter++; |
9 | |
10 | if (RCREG0 == '!' || counter >= 512) |
11 | {
|
12 | auswerten_bitte = 1; |
13 | counter = 0; |
14 | }
|
15 | }
|
In deiner while(1)-loop in main:
1 | if(auswerten_bitte) |
2 | {
|
3 | auswerten_bitte = 0; |
4 | /* suchvorgang wie oben beschrieben */
|
5 | }
|
> kann es beschrieben und ausgelesen werden? Ich hatte erst im letzten > Jahr als "alter Assembler Sack" mit C angefangen und kann im Moment erst > die groben Grundsachen. Ich hoffe, dass hier auch ein paar Pic Benutzer > dazwischen sind... Elegant lässt sich dein Vorhaben mit Zeigern umsetzen. Grundlagen dazu: Beitrag "Re: Frage zu Zeigern" http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/pointers.html P.S.: falsches Unterforum erwischt.
Hallo Michael, danke für die geduldige Antwort. Das mit dem Finde Punkt, 8 Zeichen danach.-.. ist eine gute Idee. Parallel dazu werde ich mir am Wochenende mal Zeiger lernen. Vielen Dank nochmal! Viele Grüße Axel
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.