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

Antwort per Email an