串口读取时缺少数据或整行

时间:2013-06-15 00:10:27

标签: perl winapi

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

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

使用read方法($ data = $ Port - > read(4096))并通过调整read_interval我可以得到每行的部分内容 $端口 - > read_interval(1);

或完全每三行使用 $端口 - > 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开始,但只获得每三行。

任何见解的Tx! 克里斯

1 个答案:

答案 0 :(得分: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")handshake("rts")