USSD возвращает OK вместо ответа

Я работаю над этим проектом 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()

person saviour123    schedule 07.11.2017    source источник
comment
Насколько я понимаю, команды USSD являются асинхронными - OK просто говорит о том, что команда была принята, фактический ответ будет получен в произвольное время в будущем (в зависимости от того, сколько времени потребовалось сети для обработки команды). Более длительный тайм-аут, чем 3 секунды, вероятно, приведет к получению ответа, но я не думаю, что есть какая-то особая задержка, которая гарантировала бы его получение. Правильный способ сделать это — продолжать читать, пока не увидите строку с нужным префиксом (что-то вроде +USSD:, я думаю).   -  person jasonharper    schedule 07.11.2017
comment
Спасибо, как вы думаете, мой цикл чтения настроен правильно? потому что я увеличил время, и я все еще был в порядке.   -  person saviour123    schedule 07.11.2017
comment
@jasonharper я прав с циклом: я сделал цикл бесконечным, и любая команда, касающаяся оборудования, возвращает нормально, а ussd возвращает нормально без вывода даже при ожидании более 5 секунд ...   -  person saviour123    schedule 09.11.2017
comment
@ saviour123 Я считаю, что логика должна быть сложнее, чем у вас есть. Вы читаете до тех пор, пока в последовательном порту не появятся байты, но ничто не гарантирует, что они прибудут сразу вместе. Например, вы можете получить O, затем K, а затем \r с некоторыми задержками между ними. Таким образом, вы должны читать до тех пор, пока не получите ответ, завершенный ответом, который, как вы знаете, является окончательным, например OK' or 'ERROR (или его вариант).   -  person Petr    schedule 14.11.2017
comment
Итак, я представил time.sleep(5); ser.read_all(), и теперь со мной все в порядке.   -  person saviour123    schedule 14.11.2017
comment
Возможный дубликат AT COMMANDS - USSD возвращает только OK   -  person Petr    schedule 14.11.2017