2012-08-06 33 views
0

我正在与设备连接,并需要一种方法来不断检查是否有任何字节可供串口读取,如果有我需要阅读它们并执行不同的功能。由于我正在进行的项目,我无法创建data_received事件。到目前为止,我在一个新的线程中运行了一个无限循环,但它导致计算机的速度变慢。不断检查SerialPort对象以查看是否存在任何字节,如果是,则读取字节并执行功能

有没有人有任何其他的想法?任何帮助表示赞赏。以下是我目前使用的for循环代码。

void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     object[] parameters = (object[])e.Argument; 
     SerialPort port = (SerialPort)parameters[0]; 
     agentRadio agentR = (agentRadio)parameters[1]; 

     for (; ;) 
     { 
      if (port.IsOpen) 
      { 
       try 
       { 
        if (port.BytesToRead > 0) 
        { 
         byte value = (byte)port.ReadByte(); 

         if (value == Global.OFF_CHAR) 
         { 
          port.Close(); 
          Global.isConnected = false; 
          Form form = new Form(); 
          form.deviceDisconnect(agentR); 

          MessageBox.Show("Your device has disconnected on its own, due to inactivity or because a key was switched off.", "Device Disconnect", MessageBoxButton.OK, MessageBoxImage.Information); 

          break; 
         } 
         else if (value == Global.WARNING_CHAR[0]) 
         { 
          if (Global.activeClick) 
          { 
           port.BaseStream.Write(Global.POLL_CHAR, 0, Global.POLL_CHAR.Length); 
          } 
         } 
        } 
       } 
       catch { } 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
+1

DataReceived事件专门用于您不必编写这样的代码。删除BytesToRead测试将立即解决您的问题。 – 2012-08-06 17:44:40

+0

感谢您的建议 – 2012-08-06 17:52:47

回答

2

摆脱可怕的'if(port.BytesToRead> 0)'轮询循环!为什么你这样做 - 如果检查回退为false,那么你就什么也不做,所以只要以正常的方式让读取块。

+0

默认情况下,ReadTimout属性设置为InfiniteTimeout,因此代码将位于等待数据的ReadByte方法中。你看到的减速可能来自双读(一个来自投票,一个来自阅读)。 – smvlad 2012-08-06 17:09:03

+0

我的代码在其他地方的读取超时设置为5000毫秒,所以它不会卡住等待任何事情,或者至少它不应该是。我不需要轮询循环?没有它,它会尝试读取一个字节,当没有一个字节时,并且导致不必要的超时异常。 – 2012-08-06 17:20:57

+0

'所以它不会卡住等待任何事情' - 这正是问题 - 它应该是。 – 2012-08-06 17:43:25

0

使用DataReceived事件。此事件在辅助线程中调用,不需要创建另一个事件或事件BackgroundWorker

+0

我对使用数据接收事件的担心是,我需要一些东西,我可以暂停和恢复或处理/重新初始化不同的功能,需要从我的代码中调用其他功能。因为我手动读取了数千个字节而没有收到数据接收事件,并且我需要能够随意这样做,如果用户点击不同的按钮来加载/发送设置;是否有可能暂停和恢复数据接收事件,或者更改处理程序做某事,另一个只是忽略所有内容? – 2012-08-07 14:35:22

+0

暂停并重新从串口接收数据?如果你这样做,你可能会失去数据。它可能会溢出它所具有的缓冲区,并且在您读取数据时,有些可能已经丢失。您可以使用数据接收事件“暂停”,只需在收到数据时缓冲数据,并在您认为合适时(即恢复或暂停前)处理该缓冲区。 – 2012-08-07 15:16:53

相关问题