我正在尝试在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! 克里斯
答案 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")
。