[vz-dev] vzlogger MeterD0.cpp Master branch parity

Reinhard Wilzeck reinhard at wilzeck.de
Wed Nov 20 23:36:13 CET 2013


Hallo,
erfreulicherweise kann man nun für das Protokoll D0 parity und baud rate 
über die vzlogger.conf konfigurieren.
(Nötig z.B. für Landis+Gyr E350 EDL21 .)
...
      "protocol" : "d0",     /* see 'vzlogger -h' for list of available 
protocols */
         "device" : "/dev/ttyUSB0",
     "enabled": true,
     "parity": "7e1",
     "baudrate":300,
...
Leider hat sich ein Fehler beim Setzen der einzelnen bits eingeschlichen.
(Ich weiss nicht, ob es schon jemand gesehen hat)
Dadurch wird unbeabsichtigt u.a. CRTSCTS gesetzt.
Damit sendet Udos USB IR Schreiblesekopf nicht.  (macht er richtig, denn 
ohne den vzlogger arbeitet er einwandfrei.)

falsch ist z.B.
...
     case parity_7e1:
         tio.c_cflag |= ~ PARENB;
...
Damit werden alle bits gesetzt (außer PARENB)
Richtig ist:
     switch(_parity) {
     case parity_8n1:
         tio.c_cflag &= ~ PARENB;
         tio.c_cflag &= ~ PARODD;
         tio.c_cflag &= ~ CSTOPB;
         tio.c_cflag &= ~ CSIZE;
         tio.c_cflag |= CS8;
         break;
     case parity_7n1:
         tio.c_cflag &= ~ PARENB;
         tio.c_cflag &= ~ PARODD;
         tio.c_cflag &= ~ CSTOPB;
         tio.c_cflag &= ~ CSIZE;
         tio.c_cflag |= CS7;
         break;
     case parity_7e1:
         tio.c_cflag &= ~CRTSCTS;  // für paranoide, aber nicht 
allgemein gültig.
         tio.c_cflag |=  PARENB;
         tio.c_cflag &= ~ PARODD;
         tio.c_cflag &= ~ CSTOPB;
         tio.c_cflag &= ~ CSIZE;
         tio.c_cflag |= CS7;
         break;
     case parity_7o1:
         tio.c_cflag &= ~ PARENB;
         tio.c_cflag |=  PARODD;
         tio.c_cflag &= ~ CSTOPB;
         tio.c_cflag &= ~ CSIZE;
         tio.c_cflag |= CS7;
         break;
     }

Dann klappt es auch mit dem Senden  (geprüft mit Digitalkamera) und dem 
Empfang (geprüft mit IR Fernbedienung vom Fernseher)

An dem Acknowledge, das der Zähler braucht arbeite ich noch. Außerdem 
kann man die Schnittstelle auch mit einem Timeout versehen, so das der
read nicht für immer hängen bleibt.
/* Set return rules for read to prevent endless waiting*/
      tio.c_cc[VTIME]    = 50;     /* inter-character timer 50*0.1s*/
      tio.c_cc[VMIN]     = 0;     /* VTIME is timeout counter */
Der praktische Beweis der Funktion steht aber noch aus.

Gruß
     Reinhard


More information about the volkszaehler-dev mailing list