2015-09-10 152 views
0

我有以下代码SerialPort.Read不扔TimeoutException异常

private SerialPort _port = null; 

    public SerialReader(string portname, int baudrate, Parity parity, int databits, StopBits stopbits, int readTimeoutMs = 10000) 
    { 
     //Set serial-port 
     _port = new SerialPort(); 
     _port.PortName = portname; 
     _port.BaudRate = baudrate; 
     _port.Parity = parity; 
     _port.DataBits = databits; 
     _port.StopBits = stopbits; 
     _port.ReadTimeout = readTimeoutMs; 
     _port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceivedNew); 
     _port.Open(); 
    } 

    private void SerialPort_DataReceivedNew(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort port = (SerialPort)sender; 
     _buffer = new byte[port.BytesToRead]; 
     try 
     { 
      port.Read(_buffer, 0, _buffer.Length); 
     } 
     catch (System.TimeoutException ex) 
     { 
      bool doDispose = true; 
      if (ReadTimeout != null) 
       ReadTimeout(ex, out doDispose); 

      if(doDispose) 
       this.Dispose(); 
      return; 
     } 
     /////////// 
    } 

如果连接的设备发送数据的所有工作正常,但如果我拔掉它,程序等待其他数据永远不会引发System.TimeoutExceptiondocumentation说它应该抛出异常)。

我通过在bool doDispose = true;上放置一个断点来验证这一点,它从来没有达到过。

程序集编译为“调试”。

这是一个错误还是我错过了什么?

编辑

这可能是SerialPort_DataReceivedNew不叫,因为没有数据实际收到,如果是这样的话,我怎么能发现错误?

编辑2

为了使它工作,我编辑过这样的代码:

添加的方法BeginGetData和PollSerialPort

public void BeginGetData() 
    { 
     _port.Open(); 
     Thread pollingThread = new System.Threading.Thread(new System.Threading.ThreadStart(PollSerialPort)); 
     pollingThread.Start(); 
    } 

    private void PollSerialPort() 
    { 
     while (this.SerialPort_DataReceivedNew()) ; 
    } 

和编辑SerialPort_DataReceivedNew

private bool SerialPort_DataReceivedNew() 
    { 
     _buffer = new byte[_port.BytesToRead]; 
     try 
     { 
      if (_port.Read(_buffer, 0, _buffer.Length) == 0) 
       _port.Write("\0"); 
     } 
     catch (System.TimeoutException ex) 
     { 
      bool doDispose = true; 
      if (ReadTimeout != null) 
       ReadTimeout (this, out doDispose); 

      if (doDispose) 
      { 
       _port.Close(); 
       return false; 
      } 
      return true; 
     } 
     /////////// 
    } 

_port.Write("\0");我有TimeoutException

+0

也许阅读返回一些值? 0? –

+1

http://stackoverflow.com/questions/13408476/detecting-when-a-serialport-gets-disconnected –

回答

0

更早放置断点以查看是否曾调用过DataReceived。即使是这样,并且没有数据(奇怪),您的缓冲区大小为零,因为BytesToRead为零,因此它永远不会超时。尝试在计时器事件中轮询串行端口。

相关问题