Я пытаюсь перенести следующую небольшую 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!
Возможно, вам стоит взглянуть на PHP Serial от Rémy Sanchez. Здесь есть статья об этом:
Управление последовательным портом с помощью PHP
Также посмотрите на этот пример, предоставленный jared на dctkc dot com на сайте PHP:
Довольно точно, что PHP по умолчанию не имеет доступа к аппаратным портам. Он имеет доступ к сетевым ресурсам, файловым ресурсам, но без какого-либо транспорта между оборудованием и тем, что вы пытаетесь прочитать, не может видеть, как это работает.
Тем не менее, может существовать расширение конкретной платформы, которое вы можете загрузить, что позволит это – просто провести расследование.
e: Да, есть – проверьте это расширение , возможно, это то, что вам нужно. Без этого, это просто не сработает.
«Это расширение позволяет прямому доступу к параллельному и последовательному портам (rs232) при чтении и записи DLL inpout32.dll под WIN9x / NT / 2000 / XP для любой сборки. Пример конкретичного приложения: полная автоматизация дома с веб-интерфейсом и php, соединение любого типа с портами, такими как сборки, просто или сложно. Одна идея простая, но довольно практичная … Расширение и источник были скомпилированы с Delphi 6 для PHP5.0 до 5.1.2, включая источники и примеры ».
Если вы работаете в Linux или другой UN -подобной системе UN (например, Mac OS X), попробуйте fopen('/dev/ttyS0')
– в UN X все это файл, даже последовательные порты. Посмотрите на это несколько советов по выяснению, какие карты портов сопоставляются с «файлом».