10

私の Perl プログラムは、USB 経由で接続されたシリアル デバイスからデータを読み取っています。疑似 Perl での私のスクリプトの見出し:

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 )
}

すべて正常に動作し、USB からデバイスを取り外しても、デバイス ファイルが消えて再表示されると、その状況から回復できます。自分のスクリプトから生成されたすべてのエラーをキャッチできますが、ロードされたモジュール (Device::SerialPort) も警告を生成し、それらをログに表示したくありません。

これらの特定の警告が表示されないように、コードにある種のフラグを追加できますか? 自分のスクリプトからの警告ではなく、モジュールからの警告のみが抑制されることが重要です。現在、次のようになっています。

[/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......
/usr/lib/perl5/Device/SerialPort.pm 行 2214 で、初期化されていない値 $count_in に加えて (+) が使用されています。
/usr/lib/perl5/Device/SerialPort.pm 行 2232 で、初期化されていない値 $string_in を連結 (.) または文字列で使用しています。
[/dev/ttyUSB1] 再起動が必要です!
[/dev/ttyUSB1] シリアル ポートを開けません: そのようなファイルまたはディレクトリはありません
[/dev/ttyUSB1] シリアル ポートを開けません: そのようなファイルまたはディレクトリはありません
[/dev/ttyUSB1] シリアル ポートを開けません: そのようなファイルまたはディレクトリはありません

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

ですからUse of uninitialized value、私が取り除きたいのは 2 つの警告についてです。他の警告は私自身のログです。

  • libdevice-serialport-perl 1.04-2build1
  • パール v5.12.4
4

2 に答える 2

13

警告を傍受することができます:

$SIG{'__WARN__'} = sub { warn $_[0] unless (caller eq "Device::SerialPort"); };
于 2012-04-29T08:36:10.137 に答える
3

ホーム ディレクトリにモジュールのコピーを作成し、次の 2 行を追加しました。

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

これはうまくいくようです。著者に通知した。

于 2012-04-29T11:20:24.143 に答える