2012-04-29 17 views
9

Il mio programma Perl sta leggendo i dati da un dispositivo seriale collegato tramite USB. Prima pagina del mio script in Perl: pseudo-Come sopprimere gli avvisi Perl emessi dal codice di un modulo caricato?

use warnings; 
use strict; 

use Device::SerialPort; 
my $PortObj = tie(*$handle , "Device::SerialPort" , $PortName) or die "Cannot open serial port: $!\n"; 
while (1) { 
    my $readLength = read($handle , my $frameData , $frameLength) 
} 

Tutto funziona bene e anche quando si scollega il dispositivo dalla USB sono in grado di recuperare da questa situazione, quando il file dispositivo scompare e riappare. Posso catturare tutti gli errori generati dal mio script, ma i moduli caricati (Device :: SerialPort) generano anche gli avvisi e non voglio che vengano visualizzati nella mia registrazione.

Posso aggiungere una sorta di flag al mio codice in modo da non visualizzare questi avvisi specifici? Per me è importante che solo gli avvertimenti dei moduli siano soppressi, non gli avvertimenti del mio script. Attualmente sembra che questo:

 
[/dev/ttyUSB1] 0x0020 : 00 00 00 00 00 00 00 00 00 AA 93 82 73 68 5E 58 : ............sh^X 
[/dev/ttyUSB1] 0x0030 : 55 54 52 52 4F 4E 50 51 50 00 00 00 00 00 00 00 : UTRRONPQP....... 
Use of uninitialized value $count_in in addition (+) at /usr/lib/perl5/Device/SerialPort.pm line 2214. 
Use of uninitialized value $string_in in concatenation (.) or string at /usr/lib/perl5/Device/SerialPort.pm line 2232. 
[/dev/ttyUSB1] Restart required! 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 
[/dev/ttyUSB1] Cannot open serial port: No such file or directory 

[/dev/ttyUSB1] 0x0000 : 41 42 01 40 71 01 1C E4 80 99 80 80 80 80 00 00 : [email protected] 
[/dev/ttyUSB1] 0x0010 : 00 03 00 00 83 00 01 01 00 00 00 00 00 00 00 00 : ................ 

Così è circa i due Use of uninitialized value avvertimenti che voglio sbarazzarsi. Gli altri avvisi sono i miei stessi log.

  • libdevice-serialport-perl 1.04-2build1
  • perl v5.12.4
+2

Sarebbe una buona idea riportare tali errori all'autore. – ikegami

+0

Seguito il vostro consiglio. – jippie

risposta

12

Si potrebbe cercare di intercettare le avvertenze:

$SIG{'__WARN__'} = sub { warn $_[0] unless (caller eq "Device::SerialPort"); }; 
+0

Provato, ma sfortunatamente non ha alcun effetto. – jippie

+2

@jippie, a meno che il modulo non sovrascriva specificamente '$ SIG {__ WARN __}' (non probabile) o se non sono in realtà degli avvertimenti (sì giusto), usando '$ SIG {__ WARN __}' sicuramente funziona. Potrebbe essere solo una questione di fissare il "se". s/Device :: Serial/Device :: SerialPort /, per i principianti. – ikegami

+0

Ratti, sì 'SerialPort' * not *' Serial'. Grazie, Ikegami. – kmkaplan

3

fatto una copia del modulo nella mia home directory e ha aggiunto due righe:

$ diff SerialPort.pm /usr/lib/perl5/Device/SerialPort.pm 
2207,2208d2206 
<  unless (defined $count_in) { $count_in = 0; } 
<  unless (defined $string_in) { $string_in = ""; } 

Quale sembra funzionare. Ha informato l'autore.

Problemi correlati