2012-07-20 79 views
0

我想在c#应用程序中读取来自GSM调制解调器的消息。我写了下面的代码,并使用后台工作器在单独的线程上实现Thread.sleep()。但是我使用port.ReadExisting()的时候,没有任何内容正在从端口读取。我使用错误的方式处理后台工作?使用后台工作人员的方式是否正确

private void btn_Read_Click(object sender, EventArgs e) 
    { 
     lvwMessages.Items.Clear(); 
     status_other.Visible = true; 
     status_other.Text = "Loading messages..."; 
     if (read_all.Checked) 
     { 
      port.WriteLine("AT+CMGL=\"ALL\""); 

     } 
     else if (read_unread.Checked) 
     { 
      port.WriteLine("AT+CMGL=\"REC UNREAD\""); 
     } 
     port.DiscardOutBuffer(); 
     port.DiscardInBuffer(); 

     backgroundWorker1.RunWorkerAsync(); 
    } 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Thread.Sleep(5000); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
    string res = port.ReadExisting();// here no data is fetched into res 
     //rest of the code 
+0

你确定有东西要读吗? – 2012-07-20 11:09:39

+0

是有数据要读取。我的超级终端显示它 – Cdeez 2012-07-20 11:11:59

+0

是否正在触发RunWorkerCompleted事件并正在执行读取的现有代码?你在这里设置了一个断点吗? – dtsg 2012-07-20 11:12:01

回答

2

其实,如果portSerialPort那么你做错了。 SerialPort有一个DataReceived事件,它是异步的并在数据进入时自动调用。这允许您逐步构建您的回复,并在收到完整回复时检测代码。

您可以不是只需等待5秒即可获得完整答复。

例子:

private String m_receivedData = String.Empty; 

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    m_receivedData += (sender as SerialPort).ReadExisting(); 

    if (<check whether m_receivedData contains everything I need> == true) 
    { 
     ProcessData(m_receivedData); 
     m_receivedData = String.Empty; 
    } 
} 

请注意port_DataReceived被称为一个单独的线程,所以你需要使用Invoke,如果你要更新的GUI。

编辑
只是要清楚:一个BackgroundWorker应该被用来在后台执行操作,报告状态和/或当它完成报告。仅仅使用它来暂停并不是一件有用的事情,特别是当实际流程确实包含一些“等到数据存在”的机制时,这是我上面描述的事件。

+0

是之前。这可能不是读取端口的空闲方式。我会尝试与你的建议。但我想知道为什么在上面的情况port.ReadExisting()不读取任何数据? – Cdeez 2012-07-20 11:15:01

+1

也许是因为数据还没有被读取?或者数据速度非常快,以至于'port.DiscardOutBuffer(); port.DiscardInBuffer();'抛弃它?无论如何,请删除这两行......尽可能:在有些情况下,“BackgroundWorker”是有用的。这不是其中的一个。 – 2012-07-20 11:39:06

1

是,您使用后台工作以错误的方式
更好的将使用直接的数据接收的SerialPort的事件,或者如果你想使用基于时间的解决方案一个单次定时器会更好。

+0

感谢您的建议,我会尽力去与它。但让我知道为什么端口不读取任何数据? – Cdeez 2012-07-20 11:16:26

+0

我不确定您的计算机有多快,但放弃...缓冲区函数应在WriteLine – user287107 2012-07-20 11:34:29