Я использую расширение PHP-DIO для связи со сканером отпечатков пальцев. Устройство создает изображение пальца и отправляет его обратно через последовательный порт RS232. Это довольно долго, 64520 байт чистых данных, а не строка.
Моя проблема в том, что иногда я получаю не все байты, только 50-60000.
С GTKTerm в Linux или RealTerm в Windows работает хорошо, и мои более короткие команды (идентификация по отпечатку пальца, регистрация пользователя и т. Д.) Также работают хорошо.
Почему иногда останавливается чтение данных на 50-60 Кбайт и почему просто иногда?
Мой серийный код драйвера:
protected function openPort(){
try
{
$c = stream_context_create(array('dio' =>
array('data_rate' => $this->baudRate,
'data_bits' => $this->bits,
'stop_bits' => $this->spotBit,
'parity' => 0,
'is_canonical' => 0,
)));
$bbSerialPort = null;
if (strtoupper(substr(PHP_OS, 0, 3)) === 'LIN'){
$bbSerialPort = fopen('dio.raw:///dev/ttyUSB0', 'r+', false, $c);
exec('stty -F /dev/ttyUSB0 115200 line 0 min 60 time 0 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke eof undef flush undef start undef stop undef');
}
if(!$bbSerialPort){
var_dump("Could not open Serial port {$this->portName} ");
exit;
}
$this->serialResource = $bbSerialPort;
return 1;
}
catch (Exception $e){
exit($e->getMessage());
}
}
public function sendCommand($command){
fwrite($this->serialResource, call_user_func_array('pack',$command) );
stream_set_blocking($this->serialResource, 0);
$runForSeconds = new DateInterval("PT3S");
$endTime = (new DateTime())->add($runForSeconds);
$answer = "";
while (new DateTime() < $endTime) {
$data = fread($this->serialResource,1);
if ($data !== "") {
$tmp = unpack('H*', $data);
$answer .= $tmp[1];
$endTime = (new DateTime())->add($runForSeconds);
}
}
return $answer;
}
Задача ещё не решена.
Других решений пока нет …