Форум сайта python.su
Просто нельзя в цикле проверять наличие символов в ответе.
Ответ строго декларируется. Соответственно надо ждать конкретный ответ.
Например для АТ команд, я часто получал вид -> копия отправленной команды, пустая строка, тело, пустая строка, ОК.
Или копия отправленной команды, пустая строка, Error (но так же может быть No dialtone, если это звонок, например).
Все возможные ответы должны обрабатываться.
Тут с ussd тоже самое.
Офлайн
2 Griffon:
а можно пример как вот обработать все ?
Офлайн
Я же уже писал Вам:
pyuserМодем в любом случае что-либо ответит, получите ответ полностью и анализируйте
метод readlines, только нужно таймаут задавать
Офлайн
Для начала надо знать какие ответы он может выдавать. Например если нет связи. Я ussd не использовал никогда. Буду дома, погуглю.
Исходя из того что я увидел.
answer = ""
while not(answer.startswith('Exe')): # maybe answer.startswith('Exe') or answer.startswith('Err') or 'something else'
if answer.startswith('ussd') or answer.startswith('Ple'):
continue
answer+=sp.readline()
Отредактировано (Фев. 23, 2010 17:00:49)
Офлайн
2 griffon
как-то проходит условия Оо, или например ничего не выводит, просто пару переводов каретки….
а где документация по readlines() ? Oo
не могу найти ничего по таймауту (
Отредактировано (Фев. 23, 2010 17:40:13)
Офлайн
pyxapмодуль serialutil (pyserial-2.5-rs2)
а где документация по readlines()
pyxapконструктор СОМ-порта
не могу найти ничего по таймауту
def __init__(self,
port = None, # number of device, numbering starts at
# zero. if everything fails, the user
# can specify a device string, note
# that this isn't portable anymore
# port will be opened if one is specified
baudrate=9600, # baud rate
bytesize=EIGHTBITS, # number of data bits
parity=PARITY_NONE, # enable parity checking
stopbits=STOPBITS_ONE, # number of stop bits
timeout=None, # set a timeout value, None to wait forever
xonxoff=0, # enable software flow control
rtscts=0, # enable RTS/CTS flow control
writeTimeout=None, # set a timeout for writes
dsrdtr=None, # None: use rtscts setting, dsrdtr override if true or false
interCharTimeout=None # Inter-character timeout, None to disable
):
def readlines(self, sizehint=None, eol='\n'):
"""read a list of lines, until timeout
sizehint is ignored"""
if self.timeout is None:
raise ValueError("Serial port MUST have enabled timeout for this function!")
lines = []
while 1:
line = self.readline(eol=eol)
if line:
lines.append(line)
if line[-1] != eol: # was the line received with a timeout?
break
else:
break
return lines
Отредактировано (Фев. 23, 2010 19:01:41)
Офлайн
Подрихтовал на скорую руку под 3.1 под винду. Поэтому везде в бинарном виде.
В общем у меня вообще на сони ериксон команда ussd не существует. Зато в доках нашел AT+CUSD.
Код:
try:
sp = serial.Serial(port="COM5",timeout=10)
except:
print('Error: Device is busy')
sys.exit()
if __name__ == '__main__':
print('Please wait...')
req = b'AT+CUSD=1,"*102#",15'
sp.write(req+b"\r\n")
res = b""
ans = b""
while 1:
ans = sp.readline(eol=b"\n")
if ans == b"" or ans == b"OK\r\n" or ans == b"ERROR\r\n":
break
if ans == b"\r\n" or ans == req + b"\r\r\n":
continue
res += ans
print(res)
sp.close()
sys.exit()
answer = ""
result = ""
while not(answer.startswith('Exe')): # maybe answer.startswith('Exe') or answer.startswith('Err') or 'something else'
answer = sp.readline()
if answer.startswith('ussd') or answer.startswith('Ple'):
continue
result += answer
Отредактировано (Фев. 23, 2010 20:16:56)
Офлайн
спасибо всем за ответ! очень помогло!
подскажите еще, хочу переменным передавать значение с командной строки, типа: <my_script> -k1 com3 *111#
то есть у меня эти 3 значения должны будут передаться 3м переменным, и потом уже использоваться в коде, как это лучше сделать, ссылки на примеры желательно )
upd: мой мозг сам допер, элементарные вещи фиг нагуглишь, позже выложу кусок костыля, что бы попинали меня )
Отредактировано (Фев. 24, 2010 16:00:55)
Офлайн
нашлась новая фичя, после перезапуска gsm шлюза, при коннекте по ком порту гипертерминалом (например) видим тонну текста который сообщает чем занят в данный момент шлюз, что бы активировать шлюзовый терминал(консоль) нужно набрать имя шлюза, после набора последней буквы (без нажатия “ввод”) появляется gsm терминал, и уже можно вводить запросы.
каким образом ввести имя шлюза в коде?
пробовал по разному:
sp.write('name')
sp.write('name\r')
sp.write('n')
sp.write('a\r')
консоль не активируется, как правильно передать нажатия клавиш, подскажите пжлста?
неужели нужно передавать сам код клавиш? Оо
Отредактировано (Фев. 25, 2010 21:08:15)
Офлайн
Ввод имитируется символом конца строки. Так что по идее надо просто записать имя шлюза. Т.е. sp.write('name') по идее должно работать.
Какое-то странное поведение. С телефонный модем всегда готов для приёма команд.
Попробуй “ATO0\r\n”. А затем вводить команды.
Офлайн