Device :: SerialPort不发送我的数据,除非我捕获串口

时间:2013-06-23 12:50:45

标签: linux perl serial-port

嗨, 我的小脚本使用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适用于所有情况,但不完全是我想要的,因为猫永远不会退出。

2 个答案:

答案 0 :(得分:0)

“不起作用”,你的意思是什么?写入是挂起,还是数据消失了?

我怀疑你遇到了一些流量控制设置。我并不是特别熟悉Arduino,但如果它支持硬件流控制,那么你可能会使用这些设置。

答案 1 :(得分:-1)

添加<会使文件句柄被读取,而您可能希望它是用于写入的。因此,您需要将其打开以进行写入>或追加>>。 此外,由于OS缓存文件缓冲区,您必须刷新它。有关如何操作,请参阅here in the perdoc