In a way the Anomymous monk pointed me in the right direction!, this works:
#!/usr/bin/perl
use strict;
use File::Find;
my $PortObj;
my $Registry;
my %RegHash;
my (@keys, @values);
my $os = $^O;
my (@ports, @ok_ports);
if ($os =~ /Win/i){
#comment out for linux!
eval { require Win32;
require Win32::TieRegistry;
Win32::TieRegistry->import(TiedHash=>\%RegHash);
require Win32::SerialPort;
my $computer; my $Registry= \%RegHash;
my @keys = keys( %{ $Registry->{"HKEY_LOCAL_MACHINE\\H
+ARDWARE\\DEVICEMAP\\SERIALCOMM"} } );
my @values = values( %{ $Registry->{"HKEY_LOCAL_MACHIN
+E\\HARDWARE\\DEVICEMAP\\SERIALCOMM"} } );
for (my $i=0; $i<@keys; $i++){
my $port_name = $keys[$i]; $port_name =~ s/\\/
+/g; $port_name =~ s/\.//g;
next if ($port_name =~ /SmSrl/g); my $port = $
+values[$i];
eval { if ($PortObj = new Win32::SerialPort($p
+ort, 1)) { $PortObj->close; push(@ok_ports, $port);
} else { print "$port not opening!\n";
+ }}; sleep (1);
}};
} else {
eval "use Device::SerialPort; 1" or die $@;
my $directory = '/dev';
opendir (DIR, $directory) or die $!;
while (my $file = readdir(DIR)) {
#print "$file\n";
push (@ports, "$directory/$file") if ($file =~ /ttyS/g
+);
push (@ports, "$directory/$file") if ($file =~ /ttyUSB
+/g);
}
closedir(DIR);
foreach my $port (@ports){
$PortObj = new Device::SerialPort($port, 1) or next;
$PortObj->close;
push(@ok_ports, $port);
sleep (1);
}
}
print "ports opening are: @ok_ports \n";
|