首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SerialPort.Read(.)不尊重ReadTimeOut

SerialPort.Read(.)不尊重ReadTimeOut
EN

Stack Overflow用户
提问于 2012-07-05 08:26:49
回答 1查看 19.3K关注 0票数 3

在一些与支付终端通信的遗留代码中发现了一个bug。

在开始新的支付之前,代码试图清除SerialPort的内部读取缓冲区。

我把代码删减到最低限度。它使用.NET SerialPort类型。读取超时设置为50 is。然后,它读取512个字节,并继续这样做,直到不再读取字节或抛出一个TimeoutException。

我们添加了一堆日志,它显示了对第一个Read(.)的调用方法有时需要10-15分钟,即使超时时间为50 of。然后抛出一个TimeoutException并继续该应用程序。但在阅读期间(.)应用程序挂起。

这种情况并不总是发生,由于某种原因,Windows 2000机器似乎更容易出现此错误。

代码语言:javascript
复制
public class Terminal
{
    private SerialPort _serialPort = new SerialPort();

    public void ClearReadBuffer()
    {
        try
        {   
            _serialPort.ReadTimeout = 50;
            int length;
            do
            {
                var buffer = new byte[512];
                length = _serialPort.Read(buffer, 0, 512);
            } while (length > 0);
        }
        catch (TimeoutException) {}
    }
}

任何帮助都是非常感谢的。

PS:大多数错误报告来自W2K机器,其中设备连接到一个EdgePort,它模拟一组虚拟COM端口。它的驱动程序创建了一组(约8)本地COM端口。

但是我们也有来自Windows 7的报告。如果我们直接将设备连接到PC上(没有EdgePort),我们也可以复制这个问题。然而,没有那么频繁,当它发生的时候,它的延迟不是10分钟,而是更像1-2分钟。

Update:尝试了很多方法来修复这个问题。很难复制,但是经常发生在野外,因为它分布在上千台电脑上。实际上,用另一个开源版本取代了.NET 2.0 SerialPort类型。在一台电脑上工作没有问题,我们可以在那里复制60-70%的时间。但遗憾的是,在试产期间,问题仍在继续发生。

支付终端的代码是几年前编写的,我把它移植到了另一个应用程序中。在端口期间,我重新分解了一些代码,但保留了最初的功能。在与终端通信时,代码将:

  1. 从线程池中触发另一个线程。
  2. 将消息发送到设备
  3. 从串口读取,直到收到响应或超时为止。

同时,主线程有一个while循环,其中包含一个Thread.Sleep(50)和一个Application.DoEvents()调用(yuck!)。我从其中重构了整个“等待循环”,并使用了一个WaitHandle (AutoResetEvent / ManualResetEvent)。我只是等到这把手装好了。工作没有问题,但在某些PC上,所有的串口通信都会冻结几分钟,直到有什么东西触发它。重新启用Application.DoEvents()的工作方式,问题就消失了。

不幸的是,它仍然在那里,这对我来说是一个谜,为什么这里需要它,为什么它会造成如此严重的副作用。该应用程序支持5种其他类型的串口设备。与这些设备通信从来不需要这样的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-05 08:38:41

也许在端口的“字节到读”上添加一个测试可能有助于避开编码错误的驱动程序:

代码语言:javascript
复制
length = (_serialPort.BytesToRead > 0) ? _serialPort.Read(buffer, 0, 512) : 0;

更好的是,使用

代码语言:javascript
复制
_serialPort.DiscardInBuffer();

而不是!

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

https://stackoverflow.com/questions/11340513

复制
相关文章

相似问题

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