首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不抛出TimeoutException的SerialPort.Read

不抛出TimeoutException的SerialPort.Read
EN

Stack Overflow用户
提问于 2015-09-10 18:14:48
回答 1查看 337关注 0票数 0

我有以下代码

代码语言:javascript
复制
    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方法

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 19:03:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32499070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档