我编写了一个从串行端口读取数据的 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
样子?