Perl Device :: SerialPort不会显示带有printf的传入数据(但适用于打印)

时间:2015-05-17 14:24:48

标签: c perl arduino serial-communication

我正在写一个简短的问题,通过USB串口与Arduino交谈。 我有一个关于Arduino发送数据和一切的小测试程序 如果我使用print显示数据,则会有效,但如果我使用printf(这是在Perl中)则不行。

下面的代码不起作用,print语句被注释掉了。此代码将打印<>一遍又一遍。如果我使用print 而不是printf它将打印传入的数据。

use Device::SerialPort;

$ob = Device::SerialPort->new("/dev/ttyACM0") or die "new failed\n" ;
$ob->baudrate(115200) or die "parm set failed" ;
$ob->parity('none') or die "parm set failed" ;
$ob->databits(8) or die "parm set failed" ;
$ob->stopbits(1) or die "parm set failed";
$ob->handshake('none') or die "parm set failed" ;
$ob->write_settings or die "no settings\n";
while(1){
    ($count, $line) = $ob->read(255);
#   print  $line;
    printf("<%s>\n", $line);
}

1 个答案:

答案 0 :(得分:1)

我的问题不是代码,而是终端(stdout)缓冲输出。

读取返回零个字符,因此$ line是一个空字符串,它静默地添加到输出行缓冲区。最终的 串行数据将接收行尾(\ n)并使缓冲区打印显示接收到的串行数据。

使用格式化的printf,\ n每次读取返回时都会导致输出缓冲区打印。而且,这显示出无穷无尽的空洞 括号。这使得糟糕的终端运营商感到困惑。

问题解决了....在尝试printf之前测试从读取返回的字符数。

use Device::SerialPort;
$ob = Device::SerialPort->new("/dev/ttyACM0") or die "new failed\n" ;
$ob->baudrate(115200) or die "parm set failed" ;
$ob->parity('none') or die "parm set failed" ;
$ob->databits(8) or die "parm set failed" ;
$ob->stopbits(1) or die "parm set failed";
$ob->handshake('none') or die "parm set failed" ;
$ob->write_settings or die "no settings\n";
while(1){
  ($count, $line) = $ob->read(255);
  if($count >0) {
    printf "<%s>\n", $line;
  }
}