Чтение и запись на / с последовательного устройства через USB на Linux с Perl или PHP - PullRequest
3 голосов
/ 16 февраля 2011

У меня проблема с чтением с последовательного устройства в Linux. Проблема довольно странная, и я не смог выявить причины.

Я открываю /dev/ttyUSB0 file с помощью PHP и начинаю общаться с устройством в соответствии с протоколом устройства. Много раз я сталкивался с ситуацией, когда PHP-скрипт ожидает ответа устройства. Когда я параллельно запускал Perl-скрипт, который должен был делать то же самое, он отправлял запрос на одно и то же устройство и якобы выходил без получения ответа. Затем я увидел, что PHP-скрипт получил ответ (только после того, как Perl-скрипт отправил запрос).

Я столкнулся с подобным вопросом при попытке прочитать Arduino с PHP. PHP не получил ответа от порта, но Arduino IDE Serial Monitor напечатал его.

Я думаю, что мне здесь не хватает критически важной информации о файлах 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 голос
/ 07 апреля 2012

Проверьте эти две статьи в моей вики.В первой статье описывается, как установить полезные разрешения для узла устройства.Вторая статья - это пример, который распечатывает все данные, которые пульт отправляет на ПК.Хотя написано для Arduino, оно легко переносится для других целей.

Используя lsof, вы можете узнатькакая программа в данный момент использует порт:

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

С помощью команд stty вы не блокируете порт для эксклюзивного использования.

...