Найти - Пользователи
Полная версия: Ussd запрос по COM порту
Начало » Python для новичков » Ussd запрос по COM порту
1 2 3
Griffon
Просто нельзя в цикле проверять наличие символов в ответе.
Ответ строго декларируется. Соответственно надо ждать конкретный ответ.
Например для АТ команд, я часто получал вид -> копия отправленной команды, пустая строка, тело, пустая строка, ОК.
Или копия отправленной команды, пустая строка, Error (но так же может быть No dialtone, если это звонок, например).
Все возможные ответы должны обрабатываться.
Тут с ussd тоже самое.
pyxap
2 Griffon:
а можно пример как вот обработать все ?
pyuser
Я же уже писал Вам:
pyuser
метод readlines, только нужно таймаут задавать
Модем в любом случае что-либо ответит, получите ответ полностью и анализируйте
Griffon
Для начала надо знать какие ответы он может выдавать. Например если нет связи. Я 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()
где то так. А там по выводу будет видно.
pyxap
2 griffon
как-то проходит условия Оо, или например ничего не выводит, просто пару переводов каретки….

а где документация по readlines() ? Oo
не могу найти ничего по таймауту (
pyuser
pyxap
а где документация по readlines()
модуль serialutil (pyserial-2.5-rs2)
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
):
ЗЫ. вот код функции readlines, на тот случай, если в Вашем пакете она отсутствует:
    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
Griffon
Подрихтовал на скорую руку под 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()
Вывод:
b'+CUSD : 0,“Balans …… ”\r\n'

При работе со строками фильтровать конечно легче намного. И потом вырезать результат не проблема.


ред…

неправильно написал в прошлый раз.
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
pyxap
спасибо всем за ответ! очень помогло!
подскажите еще, хочу переменным передавать значение с командной строки, типа: <my_script> -k1 com3 *111#
то есть у меня эти 3 значения должны будут передаться 3м переменным, и потом уже использоваться в коде, как это лучше сделать, ссылки на примеры желательно )

upd: мой мозг сам допер, элементарные вещи фиг нагуглишь, позже выложу кусок костыля, что бы попинали меня )
pyxap
нашлась новая фичя, после перезапуска gsm шлюза, при коннекте по ком порту гипертерминалом (например) видим тонну текста который сообщает чем занят в данный момент шлюз, что бы активировать шлюзовый терминал(консоль) нужно набрать имя шлюза, после набора последней буквы (без нажатия “ввод”) появляется gsm терминал, и уже можно вводить запросы.
каким образом ввести имя шлюза в коде?
пробовал по разному:
sp.write('name')
sp.write('name\r')
sp.write('n')
sp.write('a\r')

консоль не активируется, как правильно передать нажатия клавиш, подскажите пжлста?
неужели нужно передавать сам код клавиш? Оо
Griffon
Ввод имитируется символом конца строки. Так что по идее надо просто записать имя шлюза. Т.е. sp.write('name') по идее должно работать.
Какое-то странное поведение. С телефонный модем всегда готов для приёма команд.
Попробуй “ATO0\r\n”. А затем вводить команды.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB