我有以下代码
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;上放置一个断点来验证这一点,但它永远不会到达。
程序集被编译为"Debug“。
这是一个bug,还是我漏掉了什么?
编辑
可能没有调用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
发布于 2015-09-10 19:03:15
将断点放在较早的位置,看看是否调用过DataReceived。即使它是,并且没有数据(奇怪的),你的缓冲区大小也是零,因为BytesToRead是零,所以它永远不会超时。请尝试在计时器事件中轮询串行端口。
https://stackoverflow.com/questions/32499070
复制相似问题