我在Linux上从串口设备读取问题。 这个问题很奇怪,我无法确定原因。
我打开PHP的/ dev / ttyUSB0文件,并开始根据设备的协议与设备进行通信。 很多时候我遇到了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命令,您不会将端口锁定为独占使用。