我只是审查一些代码,我写在C#中的CF2.0串行端口进行通信。 我不使用DataReceived事件检索,因为它是不可靠的。 MSDN指出:

  

在DataReceived事件检索是不   gauranteed待提高为每个字节   接收。使用BytesToRead属性   确定有多少数据是留给   在缓冲器中被读出。

我轮询具有读端口()和具有当读取它处理数据的委托。我也读的地方,“投票是坏”(没有给出解释)。

任何想法,为什么投票可能是坏?除了通常的线程警告 - 我有轮询端口,该数据被读出后的线程退出时,所有测试的,并且效果很好一个单独的线程(后台线程)

有帮助吗?

解决方案

我读的方式,你可能会得到多个字节的一个事件,而不是每一个字节一个事件。我仍然期望得到一个事件时,数据已经准备好,并且不让它“跳过”一些字节完全。

我一直用这个事件,还没有与任何麻烦。

其他提示

传统智慧就有“轮询是坏的”,因为它常常最终被一个CPU绑定过程。如果阻塞I / O来代替,则CPU可用于其它处理,直到事件发生。

这就是说,它通常可以设置的东西,以便轮询当没有字符可用返回之前等待一个(短)超时。如果选择合适的超时,那么你的简单轮询循环使用显著较少的CPU时间,和其它过程也得到运行。

我还没有从C#中使用串口所有,但我要大胆地猜测一下文档通过

意思
  

在DataReceived事件检索不能保证被升高为接收的每一个字节。采用   所述BytesToRead属性来确定多少数据留在缓冲器中被读出。

是,你不能指望得到每个字符一个事件。它可能在某些情况下可用一个以上的字符传递事件。简单地检索所有可用的字符在你的事件处理程序,一切都会好起来。

编辑:在读线程做阻塞调用可能是整体的最佳答案。因为线程被阻塞,直到字符到达它本身并不查询。如果你需要处理的数据,因为它到达,而不是在固定大小的块,您可能需要调整缓冲区大小和一些串行端口设置。

我敢肯定底层串口驱动程序代码被中断驱动的,即便是使用阻塞读呼叫时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top