Кодирование функции ожидания из Teraterm на PythonPython

Программы на Python
Anonymous
Кодирование функции ожидания из Teraterm на Python

Сообщение Anonymous »

Я работаю над проектом, в котором хочу перенести некоторые скрипты Teraterm на Python. У меня что-то работает, но на самом деле это не соответствует тому, что я хочу: читать каждую строку в UART до тех пор, пока не истечет тайм-аут или не будет идентифицирована строка в определенном списке.
Чтобы быть более точным, я хотел бы портируйте в python что-то вроде следующего:
sendln 'ATI9'
подождите "ОК" "+CME ERROR"

(Обратите внимание, что ответ от модема содержит несколько строки, оканчивающиеся на «ОК»)
В Python я реализовал следующие два варианта, но результат меня не очень устраивает:
используя time.sleep или ser.timeout и read_until из pyserial:
Отправить AT-команду
def send_at_command(ser, команда, таймаут): print(f'Sending: {command}') ser.write((команда + '\r\n').encode('utf-8')) time.sleep(timeout) # Ожидание ответа response = ser.read_all().decode('utf-8') print(f'Response: {response}') возвращает ответ
то же, что и раньше, с таймаутом, управляемым pyserial вместо сна
def send_at_command2(ser, команда, таймаут): попробуйте: print(f'Sending: {command}') ser.timeout = таймаут # Ожидание ответа ser.write((команда + '\r\n').encode('utf-8')) ser.reset_output_buffer() response = ser.read_until('\r').decode('utf-8') print(f'Response: {response}') #ser.reset_input_buffer() кроме исключения как e: print(f'Нет ответа на {команду} : {str(e)}') print(f'Response {response} : {ser.read_all()}') ser.close() otii.shutdown() connection.close_connection() server.terminate() sys.exit() возврат ответа
Проверка ответа
def validate_response(response, ожидаемые_ключевые слова): если есть (ключевое слово в ответ на ключевое слово в ожидаемых_ключевых словах): #print('Тест пройден.') вернуть истину еще: #print('Тест не пройден.') return False
Проверить ответ AT-команды
def Wait_At_Command_Response(ser, команда, тайм-аут, ожидаемые_ключевые слова): response = send_at_command2(ser,command, timeout) #response = send_at_command(ser,command, timeout) return validate_response(ответ, ожидаемые_ключевые слова)
Затем я вызываю в своей основной функции следующее:
Wait_At_Command_Response(ser,'ATI9',2,['+CME ОШИБКА', 'ОК'])
Эти два варианта, похоже, требуют очень много времени для обработки ответа от AT-команды. Более того, я часто получаю сообщения типа «Кодек 'utf-8' не может декодировать байт 0xXX в позиции 0: неверный начальный байт».
Спасибо
Подробности см. в описании


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python

Вернуться в «Python»