在 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).
然而,即使解决了上述问题,您仍需要认真修改接收处理。您必须 读取并解析来自调制解调器的每一行响应,直到您得到最终结果代码(最常见的是 OK
或 ERROR
,但有几个其他)。任何其他方式都无法可靠地工作。有关如何正确执行此操作的伪代码结构,请参阅 this answer。
如评论所述,您关闭端口的时间过早。
我更新了这个问题并且知道它工作正常..
我尝试检查我的 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).
然而,即使解决了上述问题,您仍需要认真修改接收处理。您必须 读取并解析来自调制解调器的每一行响应,直到您得到最终结果代码(最常见的是 OK
或 ERROR
,但有几个其他)。任何其他方式都无法可靠地工作。有关如何正确执行此操作的伪代码结构,请参阅 this answer。
如评论所述,您关闭端口的时间过早。