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

C# 键入ussd命令并使用c在文本框中显示结果#,c#,winforms,serial-port,ussd,C#,Winforms,Serial Port,Ussd,我的项目中有一个Windows窗体。此表单包含3个控件:txtss、btnCheck和txtMessage。该场景是在txtss文本框中输入“ussd”命令并按下btnCheck按钮后,结果将显示在txtMessage中 下面是我的winform的详细信息 BTN检查代码: private void btnCheck_Click(object sender, EventArgs e) { try { SerialPort port = new SerialPor

我的项目中有一个Windows窗体。此表单包含3个控件:
txtss
btnCheck
txtMessage
。该场景是在
txtss
文本框中输入“ussd”命令并按下
btnCheck
按钮后,结果将显示在
txtMessage

下面是我的winform的详细信息

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);
    }
}
private void b检查\u单击(对象发送者,事件参数e)
{
尝试
{
SerialPort端口=新的SerialPort();
波特率=115200;
port.PortName=“COM3”;
端口超时=300;
port.Open();
port.Write(“AT+CUSD=1,+txtusd.Text+”,15”);

txtMessage.text=;//如果要从COM端口接收响应,需要向代码中添加事件处理程序,并将其注册到COM端口的
DataReceived
事件中,以便在接收数据时读取响应,并将其显示在
txtMessage
文本框中

由于事件将在不同的线程上发送,并且不允许从未创建UI控件的线程更新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_单击
方法中,在
port.Open();
行之后,需要添加以下行以注册事件处理程序:

port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
private void btnCheck_Click(object sender, EventArgs e)
{
    try
    {
        _port.Write("AT+CUSD=1," + txtUssd.Text + ",15");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
另一个问题是您可能在收到响应之前立即关闭COM端口。因此,我建议您执行以下操作:

  • 使
    port
    成为表单类的成员变量(将其命名为
    \u port


    你能澄清这个问题吗?请参考指南。这意味着我必须在我的项目中添加一些代码(方法port\u DataReceived)并添加
    port.DataReceived+=new SerialDataReceivedEventHandler(port\u DataReceived)
    在btnCheck中?@aminvincent是的,这是一个想法。
    port\u DataReceived
    方法可以是您表单中的私有方法。谢谢您的建议,…当我运行我的项目并单击btnCheck时消失任何内容…您能帮我修复上面的代码吗?@aminvincent对不起,我不理解您的问题。您的意思是什么“当我点击btnCheck时消失任何东西”?我再次尝试上面的代码,…绝对有效…但结果看起来还行…我不知道如何修复此问题。。。 _port = new SerialPort(); _port.BaudRate = 115200; _port.PortName = "COM3"; _port.Timeout = 300; _port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); _port.Open(); _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);
        }
    }