[英]Reading and writing to/from serial device via USB on Linux with perl or PHP
我在Linux上从串口设备读取时遇到问题。 问题相当奇怪,我无法确定原因。
我正在用PHP打开/dev/ttyUSB0 file
,并开始根据设备的协议与设备通信。 很多时候我遇到过PHP脚本等待设备响应的情况。 当我并行运行一个Perl脚本时,它应该做同样的事情,它向同一个设备发送了一个请求,并且在没有得到响应的情况下退出。 然后我看到PHP脚本得到了响应(仅在Perl脚本发送请求之后)。
我在尝试用PHP阅读Arduino时遇到了类似的问题。 PHP没有得到端口的响应,但是Arduino IDE的串行监视器打印出来了。
我想我在这里错过了关于Linux文件和USB端口的重要事情。 可能是什么问题? 如何判断哪些程序使用端口/文件?
$usb = 'ttyUSB0';
`stty -F /dev/$usb 9600`;
`stty -F /dev/$usb -parity`;
`stty -F /dev/$usb cs8`;
`stty -F /dev/$usb -cstopb`;
$f = fopen("/dev/$usb", "r+");
if(!$f) {
echo "error opening file\n";
exit;
}
statusRequest($f);
sleep(1);
$c = readPort($f);
echo "$c\n";
function statusRequest($port) {
$data = "request";
fwrite($port, $data);
fflush($port);
}
function readPort($port) {
$read = 1;
$c = '';
while($read > 0) {
$bytesr = unpack("h*", fread($port, 1));
$c .= $bytesr[1];
//echo $bytesr[1];
if($bytesr[1] == 'ff') {
$read = 0;
}
}
return $c;
}
在我的维基上查看这两篇文章。 第一篇文章介绍了如何在设备节点上设置有用的权限。 第二篇文章是打印出远程发送到PC的所有数据的示例。 虽然为Arduino编写,但它很容易移植到其他用途。
使用lsof
您可以找出当前正在使用该端口的程序:
lsof | grep /dev/ttyUSB0 cat_ttyUS 19182 jhendrix 3u CHR 188,0 0t0 14519955 /dev/ttyUSB0
使用stty命令,您不会锁定端口以供独占使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.