? remove_serialport_for_cul.patch Index: 00_CUL.pm =================================================================== RCS file: /cvsroot/fhem/fhem/FHEM/00_CUL.pm,v retrieving revision 1.96 diff -u -r1.96 00_CUL.pm --- 00_CUL.pm 17 Jul 2011 19:13:40 -0000 1.96 +++ 00_CUL.pm 22 Jul 2011 18:20:38 -0000 @@ -944,7 +941,7 @@ #Log 1, "SW: $msg"; $msg .= "\n" unless($nonl); - $hash->{USBDev}->write($msg . "\n") if($hash->{USBDev}); + syswrite($hash->{USBDev}, $msg) if($hash->{USBDev}); syswrite($hash->{TCPDev}, $msg) if($hash->{TCPDev}); select(undef, undef, undef, 0.001); @@ -957,7 +954,11 @@ my ($hash) = @_; if($hash->{USBDev}) { - my $buf = $hash->{USBDev}->input(); + my $buf; + if(!defined(sysread($hash->{USBDev}, $buf, 256))) { + CUL_Disconnected($hash); + return undef; + } #Log 1, "Got $buf"; return $buf; } @@ -988,8 +989,7 @@ delete($hash->{TCPDev}); } elsif($hash->{USBDev}) { - $hash->{USBDev}->close() ; - delete($hash->{USBDev}); + close($hash->{USBDev}); } ($dev, undef) = split("@", $dev); # Remove the baudrate @@ -1006,6 +1006,7 @@ my $dev = $hash->{DeviceName}; my $name = $hash->{NAME}; my $po; + my $res; my $baudrate; ($dev, $baudrate) = split("@", $dev); @@ -1048,11 +1049,10 @@ require Win32::SerialPort; $po = new Win32::SerialPort ($dev); } else { - require Device::SerialPort; - $po = new Device::SerialPort ($dev); + $res=open($po, "+<${dev}"); } - if(!$po) { + if(!$res) { return undef if($reopen); Log(3, "Can't open $dev: $!"); $readyfnlist{"$name.$dev"} = $hash; @@ -1063,41 +1063,11 @@ if( $^O =~ /Win/ ) { $readyfnlist{"$name.$dev"} = $hash; } else { - $hash->{FD} = $po->FILENO; + $hash->{FD} = fileno($po); delete($readyfnlist{"$name.$dev"}); $selectlist{"$name.$dev"} = $hash; } - if($baudrate) { - $po->reset_error(); - Log 3, "CUL setting $name baudrate to $baudrate"; - $po->baudrate($baudrate); - $po->databits(8); - $po->parity('none'); - $po->stopbits(1); - $po->handshake('none'); - - # This part is for some Linux kernel versions whih has strange default - # settings. Device::SerialPort is nice: if the flag is not defined for your - # OS then it will be ignored. - $po->stty_icanon(0); - #$po->stty_parmrk(0); # The debian standard install does not have it - $po->stty_icrnl(0); - $po->stty_echoe(0); - $po->stty_echok(0); - $po->stty_echoctl(0); - - # Needed for some strange distros - $po->stty_echo(0); - $po->stty_icanon(0); - $po->stty_isig(0); - $po->stty_opost(0); - $po->stty_icrnl(0); - } - - $po->write_settings; - - } if($reopen) {