Forum: Mikrocontroller und Digitale Elektronik Easymeter mit Pic auslesen


von Axel J. (Firma: Optogate) (tonaxel)


Lesenswert?

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
von Michael H. (michael_h45)


Lesenswert?

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.

von Tonaxel (Gast)


Lesenswert?

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