ReadAnswer verschluckt 0

Begonnen von kaihs, 13 Dezember 2014, 17:43:08

Vorheriges Thema - Nächstes Thema

kaihs

Hallo,

in der ReadAnswer Funktion der verschiedenen IO-Devices (konkret 00_CUL.pm) findet man diesen Code:

    if($buf) {
      Log3 $ohash->{NAME}, 5, "CUL/RAW (ReadAnswer): $buf";
      $mculdata .= $buf;
    }


Wenn $buf jetzt nur das Zeichen 0 enthält ist die Bedingung if($buf) falsch und das Zeichen 0 wird nicht an $mculdata angefügt. Das führt dazu, dass alle 0-Zeichen (ASCII-Code 48) gnadenlos unterschlagen werden.
Das auch der String "0" in perl im boolschen Kontext als falsch betrachtet wird steht so auch in der perl Doku.

Mir ist dieses Problem konkret in 00_FHEMduino.pm aufgefallen.
Hier mal ein Logauszug mit zusätzlichen Logausgaben in Devio.pm/DevIo_DoSimpleRead und FHEMduino_ReadAnswer:

2014.12.13 17:15:17 5: fd: command for gets: V
2014.12.13 17:15:17 5: SW: V
2014.12.13 17:15:17 1: buf#V 2.3 #
2014.12.13 17:15:17 1: in readanswer #V 2.3 #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): V 2.3
2014.12.13 17:15:17 1: buf#F#
2014.12.13 17:15:17 1: in readanswer #F#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): F
2014.12.13 17:15:17 1: buf#H#
2014.12.13 17:15:17 1: in readanswer #H#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): H
2014.12.13 17:15:17 1: buf#E#
2014.12.13 17:15:17 1: in readanswer #E#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): E
2014.12.13 17:15:17 1: buf#M#
2014.12.13 17:15:17 1: in readanswer #M#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): M
2014.12.13 17:15:17 1: buf#d#
2014.12.13 17:15:17 1: in readanswer #d#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): d
2014.12.13 17:15:17 1: buf#ui#
2014.12.13 17:15:17 1: in readanswer #ui#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): ui
2014.12.13 17:15:17 1: buf#n#
2014.12.13 17:15:17 1: in readanswer #n#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): n
2014.12.13 17:15:17 1: buf#o#
2014.12.13 17:15:17 1: in readanswer #o#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): o
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#-#
2014.12.13 17:15:17 1: in readanswer #-#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): -
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#c#
2014.12.13 17:15:17 1: in readanswer #c#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): c
2014.12.13 17:15:17 1: buf#o#
2014.12.13 17:15:17 1: in readanswer #o#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): o
2014.12.13 17:15:17 1: buf#m#
2014.12.13 17:15:17 1: in readanswer #m#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): m
2014.12.13 17:15:17 1: buf#p#
2014.12.13 17:15:17 1: in readanswer #p#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): p
2014.12.13 17:15:17 1: buf#i#
2014.12.13 17:15:17 1: in readanswer #i#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): i
2014.12.13 17:15:17 1: buf#l#
2014.12.13 17:15:17 1: in readanswer #l#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): l
2014.12.13 17:15:17 1: buf#e#
2014.12.13 17:15:17 1: in readanswer #e#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): e
2014.12.13 17:15:17 1: buf#d#
2014.12.13 17:15:17 1: in readanswer #d#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): d
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#a#
2014.12.13 17:15:17 1: in readanswer #a#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): a
2014.12.13 17:15:17 1: buf#t#
2014.12.13 17:15:17 1: in readanswer #t#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): t
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#D#
2014.12.13 17:15:17 1: in readanswer #D#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): D
2014.12.13 17:15:17 1: buf#e#
2014.12.13 17:15:17 1: in readanswer #e#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): e
2014.12.13 17:15:17 1: buf#c#
2014.12.13 17:15:17 1: in readanswer #c#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): c
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#1#
2014.12.13 17:15:17 1: in readanswer #1#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 1
2014.12.13 17:15:17 1: buf#3#
2014.12.13 17:15:17 1: in readanswer #3#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 3
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#2#
2014.12.13 17:15:17 1: in readanswer #2#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 2
2014.12.13 17:15:17 1: buf#0#
2014.12.13 17:15:17 1: in readanswer #0#
2014.12.13 17:15:17 1: buf#1#
2014.12.13 17:15:17 1: in readanswer #1#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 1
2014.12.13 17:15:17 1: buf#4#
2014.12.13 17:15:17 1: in readanswer #4#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 4
2014.12.13 17:15:17 1: buf# #
2014.12.13 17:15:17 1: in readanswer # #
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 
2014.12.13 17:15:17 1: buf#1#
2014.12.13 17:15:17 1: in readanswer #1#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 1
2014.12.13 17:15:17 1: buf#7#
2014.12.13 17:15:17 1: in readanswer #7#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 7
2014.12.13 17:15:17 1: buf#:03:2#
2014.12.13 17:15:17 1: in readanswer #:03:2#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): :03:2
2014.12.13 17:15:17 1: buf#1#
2014.12.13 17:15:17 1: in readanswer #1#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer): 1
2014.12.13 17:15:17 1: buf#
#
2014.12.13 17:15:17 1: in readanswer #
#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer):
2014.12.13 17:15:17 1: buf#
#
2014.12.13 17:15:17 1: in readanswer #
#
2014.12.13 17:15:17 5: FHEMduino/RAW (ReadAnswer):

2014.12.13 17:15:17 5: fd: received message for gets: V 2.3 FHEMduino  - compiled at Dec 13 214 17:03:21


Hier noch der relevante Codeabschnitt aus 00_FHEMduino.pm/FHEMduino_ReadAnswer:

  for(;;) {

    if($^O =~ m/Win/ && $hash->{USBDev}) {
      $hash->{USBDev}->read_const_time($to*1000); # set timeout (ms)
      # Read anstatt input sonst funzt read_const_time nicht.
      $buf = $hash->{USBDev}->read(999);         
      return ("Timeout reading answer for get $arg", undef)
        if(length($buf) == 0);

    } else {
      return ("Device lost when reading answer for get $arg", undef)
        if(!$hash->{FD});

      vec($rin, $hash->{FD}, 1) = 1;
      my $nfound = select($rin, undef, undef, $to);
      if($nfound < 0) {
        next if ($! == EAGAIN() || $! == EINTR() || $! == 0);
        my $err = $!;
        DevIo_Disconnected($hash);
        return("FHEMduino_ReadAnswer $arg: $err", undef);
      }
      return ("Timeout reading answer for get $arg", undef)
        if($nfound == 0);
      $buf = DevIo_SimpleRead($hash);
      Log3 "FHEMduino", 1, "in readanswer #$buf#";
      return ("No data", undef) if(!defined($buf));

    }

    if($buf) {
      Log3 $hash->{NAME}, 5, "FHEMduino/RAW (ReadAnswer): $buf";
      $mFHEMduinodata .= $buf;
    }


Wie man aus dem Log erkennen kann, wird für 0 der Code im if ($buf) nicht ausgeführt.

Mich wundert allerdings sehr, dass mir dieses Problem erst jetzt auffällt. Ich meine das hat schon mal richtig funktioniert.
Ich habe das Problem aber aktuell sowohl auf einem Rpi als auch auf meinen Entwicklungsrechner mit OpenSUSE 13.1
Das Problem tritt auch mit einem frischen fhem 5.6 auf in das ich die FHEMduino Module kopiert habe.

Hat jemand eine Erklärung für das Phänomen? Liegt es daran, dass in meinen Tests DevIo_DoSimpleRead oft einzelne Zeichen zurückliefert?
Die Baudrate ist nur auf 9600 eingestellt, so dass die Zeichen nur 'langsam' ankommen.

Wie dem auch sei, liege ich mit meiner Annahme, dass die Abfrage if ($buf) fehlerhaft ist  richtig?

Gruß,

Kai
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

rudolfkoenig

Deine Annahme ist richtig, und ich habe es im CUL gefixt.
Es faellt da vmtl. nicht auf, weil keiner der Geraete so langsam sendet.

kaihs

Danke für die schnelle Reaktion und den Fix.

Du hast das ja jetzt in

if(defined($buf))


geändert.

Das wird wohl auch funktionieren. Wenn man den darüber stehenden Code berücksichtigt könnte die Abfrage aber doch ganz entfallen, oder?

Für den Windowsfall gibt es ja schon

      return ("Timeout reading answer for get $arg", undef)
        if(length($buf) == 0);


für alle anderen Betriebssysteme

      return ("No data", undef) if(!defined($buf));


Also müsste doch $buf dort immer etwas enthalten, oder?
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

rudolfkoenig

Sehe ich auch so.
Ich lasse die Abfrage erstmal drin, ich hoffe es stoert nicht weiter.