2015-09-10 151 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爲零,因此它永遠不會超時。嘗試在計時器事件中輪詢串行端口。

相關問題