0

我正在尝试读取 115200b 的流式串行数据,但似乎无法全部读取。

使用输入法($data = $Port -> input),我得到每行的前 14 或 15 个字符。我需要整条线。

使用读取方法 ($data= $Port -> read(4096)) 并通过调整 read_interval 我可以使用 $Port->read_interval(1);

或使用 $Port->read_interval(2) 完全每隔三行;
我需要所有的每一行。

这是代码

my $App_Main_Port = Win32::SerialPort->start ($Test_cfgfile);  
$App_Main_Port->read_interval(1);  
$App_Main_Port->read_char_time(1);   
for ($i=0;;) {   
    # $data = $App_Main_Port -> input;   
    $data= $App_Main_Port -> read(4096);   
    print "$data\n";  
} 

通过调整读取间隔,我得到了上面提到的结果。我从 interval 和 char_time 参数中的默认值 100 开始,但每隔三行才获取一次。

发送任何见解!克里斯

4

1 回答 1

0

串行端口读取通常只是返回当时在串行端口中缓冲的内容。一个 16550 UART 总共只缓冲 16 个字节,这就是大多数 PC 所模拟的。

从 Win32::SerialPort 页面看来,您需要->read()在列表上下文中调用,这样您就可以找出实际读取了多少字节。如果您确实想阻止直到收到所有 4K 字符,请尝试这样的循环:

# read in 4K bytes
my ($data, $temp, $count_in, $total_in);
$total_in = 0;
while ($total_in < 4096) {
    ( $count_in, $temp ) = $App_Main_Port->read( 4096 - $total_in );
    $data .= $temp;
    $total_in += $count_in;
}

也就是说,您的真正问题听起来可能是流量控制问题。即使有这样的循环,如果您没有适当的流控制,您仍然可能会丢失字符。您可以尝试使用handshake("dtr")or handshake("rts")

于 2013-06-25T00:05:46.583 回答