@HabraXel

Как записать команду в COM-порт АТС Harris 20-20 при помощи pySerial?

Есть необходимость автоматической корректировки времени на ряде АТС Harris 20-20.
Для того, чтобы засинхронизировать время необходимо через COM-порт подключиться к АТС и ввести определённую команду.
Для автоматизации процесса было решено использовать Python и модуль pySerial.
Проблема состоит в том, что для подключения к АТС в порт необходимо отправить команду ETX.
В любой терминалке это решается нажатием клавиш Ctrl-C, ну а для того, чтобы это работало в программе, необходимо отправить в порт \x03.
Код приведён ниже:

import serial
ser = serial.Serial('COM12', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, xonxoff=1)
ser.write(chr(3))


Вот только после отправки этого символа от АТС должно выводиться приглашение ввести логин, как здесь:
<ETX> [len=2]
[len=0]
<LF><LF>*** NO DEFAULT AVAILABLE *** [len=30]
<LF> [len=1]
<LF>Username ...?

А на деле выводится лишь следующее:
<ETX>
В порт отправляется команда ETX, но никакой реакции от АТС не приходит.
Как добиться реакции от АТС?
  • Вопрос задан
  • 3421 просмотр
Решения вопроса 1
@HabraXel Автор вопроса
Загвоздка оказалась в том, что в зависимости от типа подключения к оборудованию станции Harris 20-20 (напрямую либо через модем) команду ETX необходимо посылать несколько раз.
В ходе работы я сделал 2 функции: одна проверяет доступен ли порт:
def state_port(port):                           # функция, проверяющая порт на "открыт/не открыт"
    try:
        ser = serial.Serial(port,               # параметры порта
                            baudrate=9600,
                            parity=serial.PARITY_NONE,
                            stopbits=serial.STOPBITS_ONE,
                            bytesize=serial.EIGHTBITS,
                            timeout=1)
        return True
        ser.close()
    except:
        return False

Другая - пытается открыть порт:
def open_port(buff, j):                         # функция, открывающая порт
    while j != 0:
        ser.write('\x03'.encode())
        buff = ser.readlines()
        for i in buff:
            buff_jr = i.decode()
            if 'Welcome' in buff_jr:
                return True
        else:
            j -= 1

Когда удаётся успешно подключиться к станции она в порт отправляет приветствие, в котором присутствует слово 'Welcome'. Если функция отыскивает это слово в выводе порта, то она возвращает True. Если нет - False
Используя эти функции, уже не составляет проблемы открыть порт на станции, взять системные дату и время и ввести их в станцию, засинхронизировав таким образом время.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы