Форум сайта python.su
Задача такая - есть модем, который работает с at-командами. Он подключается к компьютеру по COM-порту. Модем отвечает и принимает команды в формате ASCII. После включения питания на нем, я должен вывести его в конфигурационный режим. Для этого я даю ему длинную последовательность символов (например “ааааааааааааа”). После этого модем отвечает мне, что вышел в конфигурационный режим. Однако дальше ни одна команда не проходит. Мне приходит только повторенная at-команда.
Сразу скажу, что если использовать Putty, то все работает отлично. То есть проблем в модеме нет.
Читал все темы, но это помогло написать только тот код, который я написал. Код:
import sys import os import serial import time ser = serial.Serial(port='COM3',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None) ser.close() ser.open() ser.isOpen() print(ser.portstr) print ('Enter your commands below.\r\nInsert "exit" to leave the application.') inline=1 while 1: inline = input('>>'.encode('ascii')) if inline == 'exit': ser.close() exit() else: ser.write(inline.encode('ascii')) out = ''.encode('ascii') time.sleep(0.2) while ser.inWaiting() > 0: out += ser.readline() if out != '': print (">>".encode('ascii') + out)
Отредактировано astridsnus (Окт. 7, 2013 14:48:51)
Офлайн
наверное забыли символ конца строки? раз уж известно что модем принимает ASCII, то ему нужно как то отличать одну команду от другой. как то так вроде.
Офлайн
а как бы это написать? я разбираюсь пока что, но может вы знаете сразу?
Офлайн
ser.write(inline.encode('ascii')+'\r\n')
Офлайн
так получится ошибка декодирования байтов в строку.
если написать:
ser.write(inline.encode('ascii')+'\r\n'.encode('ascii'))
Офлайн
под питоном 2.7 все работает без encode
Офлайн
Итак, вот рабочий код, дело действительно было в конце строки:
import sys import os import serial import time ser = serial.Serial(port='COM8',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None) ser.close() ser.open() ser.isOpen() print(ser.portstr) print ('Enter your commands below.\r\nInsert "exit" to leave the application.') inline=1 while 1: inline = input("") if inline == 'exit': ser.close() exit() else: ser.write(inline.encode('ascii')+'\r'.encode('ascii')) out = ''.encode('ascii') time.sleep(0.4) while ser.inWaiting() > 0: out += ser.readline()
Офлайн
теперь возникает вопрос, как сделать этот ком-порт асинхронным. например когда мой модем устанавливает связь, он присылает мне информацию вне зависимости от того, слал я на него команду или нет.
вариант только слушать этот порт мне не подходит, потому что я иногда также должен отправлять ему команды.
буду очень благодарен, если подскажете как это реализовать.
Офлайн
astridsnusну так…
дело действительно было в конце строки
astridsnusпервый вариант это слушать некое количество времени, а затем прервать слушание, что бы отправлять команду если она присутствует, второе думаю что не сработает -это в разных потоках слушать и отправлять команду
подскажете как это реализовать.
Офлайн
идея понятна.
while 1:
читаю
читаю
пишу из буфера
читаю
читаю
когда писать команду в буфер при этом не прерывая цикл? ведь вся пробелема в том, что как только программа предлагает ввести команду чтения не будет, пока я ее не введу.
Офлайн