使用Perl或PHP在Linux上通过USB读写串行设备

3
我在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;
}
1个回答

1

请查阅我在维基上的这两篇文章。第一篇文章描述了如何在设备节点上设置有用的权限。第二篇文章是一个示例,它可以打印出远程发送到电脑上的所有数据。虽然是为Arduino编写的,但很容易适用于其他用途。

使用 lsof 命令可以查找当前正在使用端口的程序:

lsof | grep /dev/ttyUSB0 cat_ttyUS 19182 jhendrix 3u CHR 188,0 0t0 14519955 /dev/ttyUSB0

使用 stty 命令时,您不会将端口锁定为独占使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接