Я следующий код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
Возможно, Read возвращает некоторую ценность? 0? –
http://stackoverflow.com/questions/13408476/detecting-when-a-serialport-gets-disconnected –