2015-04-27 2 views
-1

У меня есть форма Windows в моем проекте. Эта форма содержит 3 элемента управления: txtUss, btnCheck и txtMessage. Сценарий заключается в том, что после ввода команды «ussd» в текстовое поле txtUss и нажата кнопка btnCheck, результат будет отображаться в txtMessage.введите команду ussd и результат отображения в текстовом поле с помощью C#

вот деталь моей WinForm https://www.dropbox.com/s/2lo8ci3rcoznvlh/ussd.PNG

btnCheck Код:

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.

Любой может предложить мне или привести пример ...?

если вы хотите получить обновление решения для этого вопроса и темы проверки баланса в модеме, перейдите по этой ссылке: Check balance using USSD Command in C#

+0

пожалуйста, вы можете уточнить этот вопрос? см. рекомендации. –

ответ

1

Если вы хотите получить ответ от COM-порта, вам нужно будет добавить обработчик события к вашему коду и зарегистрируйте его с событием DataReceived COM-порта, чтобы вы могли прочитать ответ при получении данных и отобразить его в текстовом поле txtMessage.

Поскольку событие будет отправлено в другой поток, и не разрешено обновлять элементы управления пользовательским интерфейсом из потока, который их не создал, обновление будет выполняться в два этапа, как показано ниже в следующем методе: нужно добавить в форму:

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 переменного члена вашего класса Form (назовите его _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(); 
    

держать это только в вашей кнопки обработчик события Click:

private void btnCheck_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     _port.Write("AT+CUSD=1," + txtUssd.Text + ",15"); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 
+0

, значит, я должен добавить код (метод port_DataReceived) в мой проект? и добавление 'port.DataReceived + = новый SerialDataReceivedEventHandler (port_DataReceived);' in btnCheck? – aminvincent

+0

@aminvincent да, это идея. метод 'port_DataReceived' может быть частным методом в вашей форме. – Alex

+0

спасибо за ваше предложение, .. когда я запустил свой проект и кликнув btnCheck, исчезнуть что-нибудь ..... может ли помочь мне исправить мой код выше? – aminvincent

Смежные вопросы