我正在写一个简短的问题,通过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);
}
答案 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;
}
}