【问题标题】:System.Threading.Timer and SerialPort ReadSystem.Threading.Timer 和 SerialPort 读取
【发布时间】:2011-07-11 19:28:30
【问题描述】:

我的应用程序每隔 x 毫秒从串行端口(MyDataReader)读取一些数据并将其显示在控件上,MyDataReader 也可以是一个文件,我可以从中读取数据。

我使用了一个简单的计时器,每一次我都从串口/文件中读取数据,处理并显示它,效果很好。

现在我添加了另一个我需要从中读取数据的设备,我已经切换到 System.Threading.Timer,但是现在我的“tick”功能无法正常工作,当它从串口读取时,我得到零。当我进入调试模式和断点 ReadFromSerialPort() 函数时,有时我得到有效数据,有时我没有。

如果我从串行端口读取切换到从文件读取,它工作正常,我已经调用了所有显示数据的控件。

我锁定了串口的读/写:

lock(this)
{
    writetoserialport;
    readfromserialport;
}

任何人都知道为什么我总是得到零,并且当我断点时我有时会有数据? 就像它在不同的线程上打开从串行端口的读取一样,我需要等待要读取的数据。

谢谢。

【问题讨论】:

  • 你能提供更多代码吗?
  • 为什么不在串行端口上进行异步读取,而不是轮询。

标签: c# .net multithreading timer serial-port


【解决方案1】:

嗯,串口和文件是不一样的。

文件数据存储在磁盘上,如果文件没有被截断,您可以稍后获取。 数据可以来自串口,可能不会被捕获。

因此,您必须从串行端口捕获数据并将其存储在缓冲区中。 然后计时器将从您的缓冲区中获取数据。

如果这不是您的问题,请告诉我们更多信息。

【讨论】:

  • 设备在我请求它之后立即发送数据,我写了一个请求并立即获得数据,当我开始使用 System.Threading.Timer 时,问题就开始了,当我使用常规计时器它工作正常。
【解决方案2】:

串行端口的读取不是确定性的。在您执行读取功能的那一刻,端口中可能没有数据。在实际执行读取函数之前是否检查是否有数据要读取?

在下断点的情况下,由于调试速度不同,有时会看到数据。

【讨论】:

  • 设备在我请求它之后立即发送数据,我写了一个请求并立即获得数据,当我开始使用 System.Threading.Timer 时,问题就开始了,当我使用常规计时器它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多