Как отправить конкретные ответы на последовательное соединение относительно вывода?

У меня сеанс последовательной консоли, и мне нужно ответить на конкретные вопросы с устройства. Если я введу команду "Настройка", устройство запустит мастер настройки, который задаст мне несколько вопросов. Я хочу максимально автоматизировать эту настройку, чтобы автоматически заполнить значения / ответы на соответствующие вопросы.

Эти вопросы касаются версии операционной системы всегда немного другой - также порядок вопросов. Здесь может помочь регулярное выражение.

Каков наилучший способ отправки данных на устройство, подключенное к последовательному порту, и чтения его результатов? Я попытался решить эту проблему с помощью следующего сценария, но он находится под веб-сервером 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 должно быть задано правильное значение, иначе вы не сможете общаться. Если ваше устройство использует аппаратное рукопожатие, вам нужно будет проверить несколько пунктов, прежде чем оно заработает.

Другие вопросы по тегам