Windows窗体应用程序在接收串行数据时挂起

时间:2016-03-29 16:03:32

标签: c# winforms hang

我来自嵌入式域名,需要为我的设备制作GUI。我已经在C中为设备编写了固件,并使用Visual C #Windows Form Application制作了GUI应用程序。设备正在以100ms的速度向串口发送数据,我正在尝试以winforms格式接收数据。

数据:

10Q20Q30Q40Q50Q60Q70Q80Q90Q100Q110Q120Q130Q140Q150Q

我已经编写了以下C#代码来接收它。

public Form1()
{
  InitializeComponent();

  //Using data receive event handler to receive data               
  serialPort1.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
}

然后在comPort_DataReceived我调用了Read()

void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

    Read();

}

delegate void Callbackmessage();
void Read()
{
  if (this.InvokeRequired)
  {
      Callbackmessage abc = new Callbackmessage(Read);
      this.Invoke(abc);
  }
  else
  {
    String data = serialPort1.ReadLine();

  }

最后,我正在阅读数据并将其保存到String data。该应用程序工作正常但它挂起像按钮在1秒后响应。如果我对此行String data = serialPort1.ReadLine();发表评论,那么该应用程序可以顺利运行。为什么应用程序挂起。我不知道从串口接收数据的任何其他方式。请帮忙。感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用后台工作人员。 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx 并在bacground worker RunAsync中进行读取 e.Result = serial.ReadLine() 在backgroundWorker1_RunWorkerCompleted eventHandler中,您可以获取信息并将其报告回客户端

答案 1 :(得分:0)

一般建议是使用异步IO和port.BaseStream.BeginRead。串口周围有许多异步包装器。例如,您可以查看此oneHere也是异步使用的示例。