У меня проблема с чтением с последовательного устройства в 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;
}