Как отправить конкретные ответы на последовательное соединение относительно вывода?
У меня сеанс последовательной консоли, и мне нужно ответить на конкретные вопросы с устройства. Если я введу команду "Настройка", устройство запустит мастер настройки, который задаст мне несколько вопросов. Я хочу максимально автоматизировать эту настройку, чтобы автоматически заполнить значения / ответы на соответствующие вопросы.
Эти вопросы касаются версии операционной системы всегда немного другой - также порядок вопросов. Здесь может помочь регулярное выражение.
Каков наилучший способ отправки данных на устройство, подключенное к последовательному порту, и чтения его результатов? Я попытался решить эту проблему с помощью следующего сценария, но он находится под веб-сервером Windows, не может прочитать журнал консоли:
<!DOCTYPE html>
<html>
<header>
<meta charset="utf8">
</header>
<body>
<?php
//-- settings --//
//brainboxes serial ports
//on 'nix start with cu.usbserial-
//on windows starts with com : must be lower case in windows and end with a colon
$portName = 'COM35';
$baudRate = 9600;
$bits = 8;
$spotBit = 1;
?>
Serial Port Test<br>
================<br>
<br>
<?php
function echoFlush($string)
{
echo $string . "\n";
flush();
ob_flush();
}
if(!extension_loaded('dio'))
{
echoFlush( "PHP Direct IO does not appear to be installed for more info see: http://www.php.net/manual/en/book.dio.php" );
exit;
}
try
{
//the serial port resource
$bbSerialPort;
echoFlush( "Connecting to serial port: {$portName}<br><br>" );
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
$bbSerialPort = dio_open('\\\\.\COM35', O_RDWR);
//we're on windows configure com port from command line
exec("mode {$portName} baud={$baudRate} data={$bits} stop={$spotBit} parity=n xon=on");
}
else //'nix
{
$bbSerialPort = dio_open('\\\\.\COM35', O_RDWR | O_NOCTTY | O_NONBLOCK );
dio_fcntl($bbSerialPort, F_SETFL, O_SYNC);
//we're on 'nix configure com from php direct io function
dio_tcsetattr($bbSerialPort, array(
'baud' => $baudRate,
'bits' => $bits,
'stop' => $spotBit,
'parity' => 0
));
}
if(!$bbSerialPort)
{
echoFlush( "Could not open Serial port {$portName}<br><br>");
exit;
}
// send data
$dataToSend = "version\n";
echoFlush( "Writing to serial port data: \"{$dataToSend}\"<br>" );
if($bytesSent = dio_write($bbSerialPort, $dataToSend )) {
echoFlush( "Sent: {$bytesSent} bytes<br><br>" );
echoFlush( "Closing Port" );
dio_close($bbSerialPort);
}
}
?>
</body>
</html>
Я надеюсь, что кто-нибудь может мне помочь.
ПРИМЕЧАНИЕ. Устройство представляет собой NetApp FAS-Head.
1 ответ
У вас есть документация для устройства? Вы должны проверить, чтобы увидеть, какие настройки он требует. Вам нужно убедиться, что у вас есть правильные значения для: имени порта, скорости передачи, бита четности, битов данных и стоп-бита при открытии экземпляра объекта и что свойства рукопожатия, newLine, RtsEnable, DtrEnable и Encoding установлены правильно прежде чем вы сможете общаться. Многие из этих аргументов и свойств имеют значения по умолчанию, которые работают большую часть времени, но вашему устройству могут потребоваться настройки, отличные от настроек по умолчанию. В частности, для свойства Handshake должно быть задано правильное значение, иначе вы не сможете общаться. Если ваше устройство использует аппаратное рукопожатие, вам нужно будет проверить несколько пунктов, прежде чем оно заработает.