シリアル ポートからデータを読み取る Perl スクリプトを作成しました。
use Device::SerialPort;
$PortObj = new Device::SerialPort ($PortName, $quiet, $lockfile);
$PortObj->read_const_time( 500 ); # timeout waiting for data after 500ms
...
メイン ループは、シリアル ポートからデータを読み取ろうとします。
while ( 1 ) {
( $count, $data ) = $PortObj->read( $frameLength );
process_my_data( $data );
do_something_entirely_different_that_needs_being_done;
}
しかし、(多くの時間を消費する) $PortObj->read タイムアウトを発生させるのではなく、バッファ内のデータが使用可能かどうかをテストできるようにして、ループを高速化できるようにしたいと考えています。
while ( 1 ) {
if ( test_serial_data_available ) { ( $count, $data ) = $PortObj->read( $frameLength ); }
do_something_entirely_different_that_needs_being_done;
}
データの可用性についてシリアル バッファをテストできますか?
EDIT1:今朝、シリアルデバイスをファイルハンドルとして使用し、データの読み取りが機能するように問題を書き直しましたが、それでもループをブロックしています。これにより、バッファで利用可能なデータをチェックするための新しいオプションが開かれる可能性があります。疑似 Perl の場合:
use Symbol qw( gensym );
my $handle = gensym();
my $PortObj = tie( *$handle, "Device::SerialPort", $PortName );
while ( 1 ) {
my $frameData;
if ( test_serial_data_available ) { my $readLength = read( $handle , $frameData , $frameLength ); }
do_something_entirely_different_that_needs_being_done;
}
だから私の質問は:どのtest_serial_data_available
ように見えるべきですか?