嗨,
我的小脚本使用Device::SerialPort
与串口进行交互时遇到了一个奇怪的问题。
我的代码如下:
use Device::SerialPort;
my $port = new Device::SerialPort("/dev/ttyACM0") or croak("no.... $!");
$port->baudrate(9600) || die "failed setting baudrate: $!";
$port->parity("none") || die "failed setting parity: $!";
$port->databits(8) || die "failed setting databits: $! ";
$port->stopbits(1) or die "failed setting stops: $!";
$port->handshake("none") || die "failed setting handshake: $!";
$port->write_settings or croak("Failed setting... everything: $!");
my $foo = $port->write("o0") or croak("Failed writing: $!");
die("WRITE FAILED!\n") unless $foo;
die("WRITE INCOMPLETE!\n") if $foo != 2;
$port->close() or die("close.... $!");
奇怪的是,如果我在运行perl代码之前执行cat /dev/ttyACM
,那么一切都按预期工作。
我尝试添加open($fh, '<', '/dev/ttyACM0');
来打开像cat
这样的端口应该这样做,但是唉,没有运气。
我做错了什么?
更新:好的......奇怪的是。如果我使用stty -F /dev/ttyACM0 raw speed 9600
将串行端口设置为9600并尝试echo o0 > /dev/ttyACM0
它不起作用。但是,如果我在做回声时做cat /dev/ttyACM0
它可以正常工作。
另一端的设备是Arduino Mega,如果这与此有关..
cat > /dev/ttyACM0
适用于所有情况,但不完全是我想要的,因为猫永远不会退出。
答案 0 :(得分:0)
“不起作用”,你的意思是什么?写入是挂起,还是数据消失了?
我怀疑你遇到了一些流量控制设置。我并不是特别熟悉Arduino,但如果它支持硬件流控制,那么你可能会使用这些设置。
答案 1 :(得分:-1)
添加<
会使文件句柄被读取,而您可能希望它是用于写入的。因此,您需要将其打开以进行写入>
或追加>>
。
此外,由于OS缓存文件缓冲区,您必须刷新它。有关如何操作,请参阅here in the perdoc。