Я работаю над этим проектом ussd, который просто проверяет баланс на модеме и распечатывает его. Тем не менее, я застрял на этом этапе, когда на моем экране печатается «ОК». Моя команда ussd возвращает только «ОК», а не фактический ответ ussd.
Я работаю в pyserial. Итак, если я отправлю * 124 # для проверки баланса, я ожидаю баланс, но в итоге он возвращает «ОК».
что не так.
import glob
import time
import serial
from pdu import pdu_to_text, text_to_pdu
def list_ports():
ports = glob.glob('/dev/ttyUSB*')
for val, port in enumerate(ports):
print(val, port)
print('-----------------------')
port = int(input('your desired port: '))
print('You selected' + ports[port])
return ports[port]
def command_maker():
command = raw_input('enter ATCommand: ')
return bytes(command.encode('utf-8'))
def ussd_maker():
# return '1' is specified here to allow return of a casted string
ussd_code = convert_text2pdu(raw_input('Input the USSD code: '))
ussd_command = "at+cusd=1, " + str(ussd_code) + ', 15\r\n'
print(ussd_command)
return bytes(ussd_command.encode('utf8'))
def convert_pdu2text(pdu_encoded_data):
"""
Convert pdu encoded data to text(string *utf-8*)
"""
pdu_decoded_to_text = pdu_to_text(pdu_encoded_data)
return pdu_decoded_to_text
def convert_text2pdu(unicode_string):
"""
Convert text to pdu format to work with gsm modems and any other
device that support pdu data format
"""
text_encoded_to_pdu = text_to_pdu(unicode_string)
return text_encoded_to_pdu
def app_run(port, atcmd):
ser = serial.Serial()
ser.port = (port)
try:
ser.open()
time.sleep(0.5)
ser.write(bytes(atcmd) + b'\r\n')
out = b''
time.sleep(3)
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print("------response--------\n" + out.decode("utf-8"))
ser.close()
except Exception as e:
raise e
def app():
select_option = raw_input('Select your desired option. \n1. Send raw AT command \n2. Send USSD code: \n')
print(select_option)
ls_ports = list_ports()
if select_option == '1':
cmd_maker = command_maker()
app_run(ls_ports, cmd_maker)
elif select_option == '2':
ussd = ussd_maker()
app_run(ls_ports, ussd)
else:
app()
if __name__ == "__main__":
app()
OK
просто говорит о том, что команда была принята, фактический ответ будет получен в произвольное время в будущем (в зависимости от того, сколько времени потребовалось сети для обработки команды). Более длительный тайм-аут, чем 3 секунды, вероятно, приведет к получению ответа, но я не думаю, что есть какая-то особая задержка, которая гарантировала бы его получение. Правильный способ сделать это — продолжать читать, пока не увидите строку с нужным префиксом (что-то вроде+USSD:
, я думаю). - person jasonharper   schedule 07.11.2017O
, затемK
, а затем\r
с некоторыми задержками между ними. Таким образом, вы должны читать до тех пор, пока не получите ответ, завершенный ответом, который, как вы знаете, является окончательным, напримерOK' or 'ERROR
(или его вариант). - person Petr   schedule 14.11.2017time.sleep(5); ser.read_all()
, и теперь со мной все в порядке. - person saviour123   schedule 14.11.2017read_all()
кажется неправильным и работает просто по счастливой случайности. Что здесь означает «все»? Библиотека не знает команд модема, она не знает, когда она должна прекратить чтение, когда у вас будут «все» данные. Вам нужно знать протокол модема и продолжать чтение, пока вы не узнаете, что устройство вернуло полный вывод. - person Petr   schedule 14.11.2017