使用 C# 在文本框中键入 ussd 命令并显示结果
type ussd command and display result in textbox using c#
我的项目中有一个 Windows 表单。此表单包含 3 个控件:txtUss
、btnCheck
和 txtMessage
。场景是在 txtUss
文本框中输入 "ussd" 命令并按下 btnCheck
按钮后,结果将显示在 txtMessage
.
这是我的 winform 的详细信息
https://www.dropbox.com/s/2lo8ci3rcoznvlh/ussd.PNG
btn校验码:
private void btnCheck_Click(object sender, EventArgs e)
{
try
{
SerialPort port = new SerialPort();
port.BaudRate = 115200;
port.PortName = "COM3";
port.Timeout = 300;
port.Open();
port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
txtMessage.text = ; // <<< here is the result.
// but i dont know how to refer port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我不知道如何在txtMessage
文本框中得到结果。
任何人都可以建议我或举一些例子......?
如果你想获得更新解决这个问题和主题检查调制解调器余额,请按照此 link :
如果你想接收来自COM口的响应,你需要在你的代码中添加一个事件处理程序,并注册到COM口的DataReceived
事件中,这样你就可以读取响应收到数据时,将其显示在 txtMessage
文本框中。
因为事件将在不同的线程上发送,并且不允许从未创建它们的线程更新 UI 控件,所以更新将分两步进行,如下所示您需要将下面的方法添加到您的表单中:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// read the response.
var response = ((SerialPort)sender).ReadLine();
// Need to update the txtMessage on the UI thread.
this.Invoke(new Action(() => txtMessage.Text = response));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在您的 btnCheck_Click
方法中,您需要在行 port.Open();
之后添加以下行,以注册事件处理程序:
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
另一个问题似乎是您立即关闭了 COM 端口,可能是在收到响应之前。因此,我建议您执行以下操作:
使 port
成为表单的成员变量 class(将其命名为 _port
)。
private SerialPort _port
创建表单时创建并打开 COM 端口:
_port = new SerialPort();
_port.BaudRate = 115200;
_port.PortName = "COM3";
_port.Timeout = 300;
_port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
_port.Open();
关闭表单时关闭并处理 COM 端口。
_port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
_port.Close();
_port.Dispose();
仅将其保留在您的按钮单击事件处理程序中:
private void btnCheck_Click(object sender, EventArgs e)
{
try
{
_port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我的项目中有一个 Windows 表单。此表单包含 3 个控件:txtUss
、btnCheck
和 txtMessage
。场景是在 txtUss
文本框中输入 "ussd" 命令并按下 btnCheck
按钮后,结果将显示在 txtMessage
.
这是我的 winform 的详细信息 https://www.dropbox.com/s/2lo8ci3rcoznvlh/ussd.PNG
btn校验码:
private void btnCheck_Click(object sender, EventArgs e)
{
try
{
SerialPort port = new SerialPort();
port.BaudRate = 115200;
port.PortName = "COM3";
port.Timeout = 300;
port.Open();
port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
txtMessage.text = ; // <<< here is the result.
// but i dont know how to refer port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我不知道如何在txtMessage
文本框中得到结果。
任何人都可以建议我或举一些例子......?
如果你想获得更新解决这个问题和主题检查调制解调器余额,请按照此 link :
如果你想接收来自COM口的响应,你需要在你的代码中添加一个事件处理程序,并注册到COM口的DataReceived
事件中,这样你就可以读取响应收到数据时,将其显示在 txtMessage
文本框中。
因为事件将在不同的线程上发送,并且不允许从未创建它们的线程更新 UI 控件,所以更新将分两步进行,如下所示您需要将下面的方法添加到您的表单中:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// read the response.
var response = ((SerialPort)sender).ReadLine();
// Need to update the txtMessage on the UI thread.
this.Invoke(new Action(() => txtMessage.Text = response));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在您的 btnCheck_Click
方法中,您需要在行 port.Open();
之后添加以下行,以注册事件处理程序:
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
另一个问题似乎是您立即关闭了 COM 端口,可能是在收到响应之前。因此,我建议您执行以下操作:
使
port
成为表单的成员变量 class(将其命名为_port
)。private SerialPort _port
创建表单时创建并打开 COM 端口:
_port = new SerialPort(); _port.BaudRate = 115200; _port.PortName = "COM3"; _port.Timeout = 300; _port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); _port.Open();
关闭表单时关闭并处理 COM 端口。
_port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); _port.Close(); _port.Dispose();
仅将其保留在您的按钮单击事件处理程序中:
private void btnCheck_Click(object sender, EventArgs e)
{
try
{
_port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}