使用 C# 在文本框中键入 ussd 命令并显示结果

type ussd command and display result in textbox using c#

我的项目中有一个 Windows 表单。此表单包含 3 个控件:txtUssbtnChecktxtMessage。场景是在 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 端口,可能是在收到响应之前。因此,我建议您执行以下操作:

  1. 使 port 成为表单的成员变量 class(将其命名为 _port)。

    private SerialPort _port
  2. 创建表单时创建并打开 COM 端口:

    _port = new SerialPort();
    _port.BaudRate = 115200;
    _port.PortName = "COM3";
    _port.Timeout = 300;
    
    _port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
    _port.Open();
    
  3. 关闭表单时关闭并处理 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);
    }
}