Проверка баланса с помощью USSD-команды в C#

Я обновляю этот вопрос и знаю, что он работает правильно..

Я пытаюсь проверить баланс в моем модеме mavecom, но я не получаю ответа в своем текстовом поле. Он остается пустым.

Вот мой код:

private SerialPort _port;

private void simpleButton1_Click(object sender, EventArgs e)
    {
        _port = new SerialPort();
        _port.PortName = cbPort.Text;
        _port.BaudRate = 115200;
        _port.Parity = Parity.None;
        _port.DataBits = 8;
        _port.StopBits = StopBits.One;
        _port.Handshake = Handshake.RequestToSend;

        port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        port.Open();

        port.Write("AT+CUSD=1,\"" + txtUSSD.Text + "\",15" + "\r");
    }

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            // read the response.
            var response = ((SerialPort)sender).ReadLine();

            // Need to update the txtProvider on the UI thread .
            //showing result in txtOutput based on txtProvider USSD Command
            this.Invoke(new Action(() => txtOutput.Text = response)); 
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Это решено и может быть использовано для проверки баланса....


person aminvincent    schedule 28.07.2015    source источник
comment
Не закрывайте порт сразу после записи в него.   -  person Ron Beyer    schedule 28.07.2015
comment
Также рекомендуется зарегистрироваться на DataReceived перед открытием последовательного порта.   -  person Niels Filter    schedule 28.07.2015
comment
давайте сначала попробуем ваше предложение   -  person aminvincent    schedule 29.07.2015
comment
ребята, .. он все еще исчезает ... в txtOutput ничего не найдено   -  person aminvincent    schedule 29.07.2015
comment
Не добавляйте слова [Решено] в заголовок, так это не работает. Вместо этого отметьте правильный ответ.   -  person JK.    schedule 16.11.2015
comment
нет правильного ответа на этот вопрос, .. я просто исправляю это сам и хочу, чтобы другой читатель мог знать и использовать этот пример кода, .. спасибо   -  person aminvincent    schedule 16.11.2015


Ответы (1)


Хорошее начало, вы правильно завершаете командные строки AT с помощью \r (не используя WriteLine или любые другие неправильные подходы, которые, к сожалению, являются распространенными проблемами для начинающих). Однако формат команды определен в 27.007 как

AT+CUSD=[<n>[,<str>[,<dcs>]]]
...
Defined values
...
<str>: string type USSD-string ...

а строковые параметры всегда заключаются в двойные кавычки (V .250 глава 5.4.2.2 Строковые константы: String constants shall be bounded at the beginning and end by the double-quote character).

Поэтому, не зная подробно об объекте textProvider, я совершенно уверен, что ваш код должен быть

port.Write("AT+CUSD=1,\"" + txtProvider.Text + "\",15" + "\r");

но обратите внимание, что если txtProvider.Text содержит какие-либо " символы, они должны быть экранированы (кстати, не как \", проверьте 5.4.2.2).


Однако даже с вышеперечисленным исправлением вам необходимо серьезно переработать обработку приема. Вы ДОЛЖНЫ читать и анализировать каждую строку ответа от модема, пока не получите окончательный код результата (чаще всего OK или ERROR, но есть и другие). Любой другой способ не может работать надежно. См. этот ответ для структуры псевдокода, как это сделать правильно.

И, как было сказано, вы слишком рано закрываете порт.

person hlovdal    schedule 28.07.2015
comment
"\",15" + "\r" может быть просто "\",15\r" - person Ben Voigt; 29.07.2015
comment
@hlovdal, когда я меняю ussd по команде типа port.Write("AT+CUSD=1,\"" + txtProvider.Text + "\",15" + "\r");, ничего не происходит, ... нет результата в txtOutput - person aminvincent; 29.07.2015