gpt4 book ai didi

c - Perl Device::SerialPort 不会使用 printf 显示传入数据(但可以使用 print)

转载 作者:太空宇宙 更新时间:2023-11-04 03:38:41 24 4
gpt4 key购买 nike

我正在写一个小问题,通过 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);
}

最佳答案

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

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

使用格式化的 printf,\n 导致每次读取返回时打印输出缓冲区。而且,这显示的和无尽的空流括号。这让可怜的码头运算符(operator)感到困惑。

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

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;
}
}

关于c - Perl Device::SerialPort 不会使用 printf 显示传入数据(但可以使用 print),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30287832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com