Проверьте баланс с помощью USSD Command в 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);
        }
    }

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

1 ответ

Решение

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

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

строковые параметры всегда должны быть заключены в двойные кавычки ( стр. 5.4.2.2 строковых констант V.250: 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, но есть несколько других). Любой другой способ не может работать надежно. Посмотрите этот ответ для псевдокодовой структуры о том, как сделать это правильно.

И, как уже говорилось, вы закрываете порт слишком рано.

Другие вопросы по тегам