2015-09-10 4 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.TimeoutException (documentation говорит что он должен исключать исключение).

Я проверил это, поставив точку останова на bool doDispose = true;, и он никогда не был достигнут.

Сборка составлена ​​как «Отладка».

Это ошибка или я что-то упускаю?

Редактировать

Вполне возможно, что SerialPort_DataReceivedNew не вызывается, потому что никакие данные фактически не получены, если это так, то как я могу поймать ошибки?

Edit 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"); I есть TimeoutException

+0

Возможно, Read возвращает некоторую ценность? 0? –

+1

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

ответ

0

Положите вашу точку останова раньше, чтобы узнать, когда-либо вызывается DataReceived. Даже если это так, и нет данных (странно), ваш размер буфера равен нулю, потому что BytesToRead равен нулю, поэтому он никогда не будет таймаутом. Попробуйте выполнить опрос последовательного порта в событии таймера.

Смежные вопросы