繁体   English   中英

使用perl或PHP在Linux上通过USB读取和写入串行设备

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM