在 C# 中使用 USSD 命令检查余额

Check balance using USSD Command in 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);
        }
    }

已解决,可用于查询余额....

良好的开端,您使用 \r 正确终止了 AT 命令行(不使用 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).


然而,即使解决了上述问题,您仍需要认真修改接收处理。您必须 读取并解析来自调制解调器的每一行响应,直到您得到最终结果代码(最常见的是 OKERROR,但有几个其他)。任何其他方式都无法可靠地工作。有关如何正确执行此操作的伪代码结构,请参阅 this answer

如评论所述,您关闭端口的时间过早。