diff --git a/fhem/FHEM/Blocking.pm b/fhem/FHEM/Blocking.pm index 431cf842a..ac45b7719 100644 --- a/fhem/FHEM/Blocking.pm +++ b/fhem/FHEM/Blocking.pm @@ -80,7 +80,7 @@ BlockingCall($$@) foreach my $d (sort keys %defs) { # Close all kind of FD my $h = $defs{$d}; TcpServer_Close($h) if($h->{SERVERSOCKET}); - DevIo_CloseDev($h) if($h->{DeviceName}); + DevIo_CloseDev($h,1) if($h->{DeviceName}); } no strict "refs"; diff --git a/fhem/FHEM/DevIo.pm b/fhem/FHEM/DevIo.pm index a990dfa39..19d477af3 100644 --- a/fhem/FHEM/DevIo.pm +++ b/fhem/FHEM/DevIo.pm @@ -6,7 +6,7 @@ sub DevIo_SimpleRead($); sub DevIo_TimeoutRead($$); sub DevIo_SimpleWrite($$$); sub DevIo_OpenDev($$$); -sub DevIo_CloseDev($); +sub DevIo_CloseDev($@); sub DevIo_Disconnected($); sub DevIo_SetHwHandshake($); @@ -279,9 +279,9 @@ DevIo_SetHwHandshake($) ######################## sub -DevIo_CloseDev($) +DevIo_CloseDev($@) { - my ($hash) = @_; + my ($hash,$isFork) = @_; my $name = $hash->{NAME}; my $dev = $hash->{DeviceName}; @@ -292,7 +292,11 @@ DevIo_CloseDev($) delete($hash->{TCPDev}); } elsif($hash->{USBDev}) { - $hash->{USBDev}->close() ; + if($isFork) { # SerialPort close resets the serial parameters. + POSIX::close($hash->{USBDev}{FD}); + } else { + $hash->{USBDev}->close() ; + } delete($hash->{USBDev}); } elsif($hash->{DIODev}) {