Как читать последовательный порт RS232 в PHP, как эта программа QBasic - PullRequest
5 голосов
/ 12 июля 2010

Я пытаюсь портировать следующую маленькую программу QBASIC (которая работает на 100%) на PHP:

OPEN "com1:2400,n,8,1,DS," FOR RANDOM AS #3
OPEN "data.dat" FOR OUTPUT AS #2
REM read 17 chars from the port
scale$ = INPUT$(17, #3)
PRINT scale$
WRITE #2, scale$
CLOSE #2
CLOSE #3
SYSTEM

В настоящее время я вызываю ее в скомпилированной (exe) форме из PHP (на WAMP5) но я бы хотел избавиться от QBASIC и вызывать его напрямую из PHP.

Я написал эту функцию PHP, но она просто висит в строке fgets ():

function read_port($port='COM1:', $length=17, $setmode=TRUE, $simulate='') {
    if ($simulate){
        $buffer = '"'.strval(rand(1000, 2000));
        return $buffer;
    }
    if ($setmode){
        shell_exec('mode com1: baud=2400 parity=n data=8 stop=1 to=on xon=off odsr=on octs=on dtr=on rts=on idsr=on');
    }
    $fp = fopen($port, "rb+");
    if (!$fp) {
        file_put_contents('debug1.log','COM1: could not open'."\n",FILE_APPEND);
    } else {
        $buffer = fgets($fp, $length); // <-- IT JUST HANGS HERE DOING NOTHING !
        fclose ($fp);
    }
    return $buffer;

}

Я использую эту строку PHP для вызова вышеуказанной функции:

$res = read_port('COM1:', 17, TRUE, SIMULATE_SCALE);

Любая помощь будет признательна!Я в основном бросил пытаться.Если QBASIC может сделать это отлично, то мы должны быть в состоянии сделать эту работу с PHP!

Ответы [ 3 ]

10 голосов
/ 12 июля 2010

Возможно, вы захотите взглянуть на PHP Serial от Реми Санчеса. Здесь есть статья об этом:

Управление последовательным портом с помощью PHP

Также посмотрите на этот пример, предоставленный jared на dctkc dot com на сайте PHP:

http://php.net/manual/en/function.fopen.php#20935

5 голосов
/ 12 июля 2010

Уверен, PHP по умолчанию не имеет доступа к аппаратным портам.Он имеет доступ к сетевым ресурсам, файловым ресурсам, но без какого-либо транспорта между аппаратным обеспечением и тем, что вы пытаетесь прочитать, он не видит, как это работает.

Однако может существовать расширение, специфичное для платформы.Можно загрузить, что позволит это - просто расследование.

e: Да, есть - отметьте это расширение , возможно, вы ищете.Без чего-то подобного это просто не сработает.

"Это расширение обеспечивает прямой доступ к параллельному и последовательному порту (rs232) при чтении и записи с помощью библиотеки DLL inpout32.dll в WIN9x / NT / 2000 / XP для любой сборки. Пример конкретногоПрименение: Полная домашняя автоматизация с веб-интерфейсом и php, аппаратные средства связи любого рода с портами, подобными сборкам, простыми или сложными. Одна идея простая, но довольно практичная ... Расширение и исходный код были скомпилированы с Delphi 6 для PHP 5.0 до 5.1.2, источники и пример включены. "

3 голосов
/ 12 июля 2010

Если вы работаете в Linux или другой UN X-подобной системе (например, Mac OS X), попробуйте fopen('/dev/ttyS0') - в UN X все будет файлом, даже последовательным портом. См. , где приведены несколько советов, чтобы узнать, какой порт соответствует какому "файлу".

...