首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串口通信:轮询串口与使用串口DataReceived事件

串口通信:轮询串口与使用串口DataReceived事件
EN

Stack Overflow用户
提问于 2009-03-13 20:59:59
回答 3查看 12.4K关注 0票数 16

我只是回顾一下我编写的一些代码,以便在CF2.0上与C#中的串口通信。我不使用DataReceived事件,因为它不可靠。MSDN指出:

对于接收到的每个字节,都不会引发DataReceived事件。使用BytesToRead属性确定缓冲区中要读取的数据数量。

我使用read()轮询端口,并有一个委托在读取数据时处理数据。我还在某个地方读到“轮询是不好的”(没有给出解释)。

你知道为什么投票可能会很糟糕吗?除了通常的线程警告-我有一个单独的线程(后台线程)轮询端口,线程退出后,数据被读取,所有测试和工作良好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-13 21:06:27

按照我的阅读方式,您可能会得到多个字节的一个事件,而不是每个字节一个事件。当数据准备好时,我仍然希望得到一个事件,而不是让它“跳过”一些字节。

我一直在利用这个事件,而且没有遇到任何麻烦。

票数 19
EN

Stack Overflow用户

发布于 2009-03-13 21:08:20

传统观点认为,“轮询是不好的”,因为它最终往往是一个CPU绑定的进程。如果使用阻塞I/O,则CPU可用于其他进程,直到事件发生为止。

也就是说,通常可以设置一些内容,以便在没有可用字符的情况下,在返回之前,轮询等待(短)超时。如果选择了合适的超时,那么简单的轮询循环使用的CPU时间要少得多,其他进程也可以运行。

我根本没有使用过来自C#的串行端口,但我要猜测一下文档的含义是什么

对于接收到的每个字节,都不能保证引发DataReceived事件。使用BytesToRead属性确定缓冲区中要读取的数据数量。

你不能指望每个角色都有一个事件。在某些情况下,它可能提供具有多个可用字符的事件。只需检索事件处理程序中的所有可用字符,就可以了。

编辑:对读取器线程执行阻塞调用的可能是总体上最好的答案。这本身并不是轮询,因为线程在字符到达之前被阻塞。如果您需要在数据到达时处理数据,而不是按固定大小的块处理数据,则可能需要调整缓冲区大小和一些串行端口设置。

票数 9
EN

Stack Overflow用户

发布于 2010-07-25 18:50:32

我确信底层的串口驱动程序代码是中断驱动的,即使在使用阻塞读取调用时也是如此。

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

https://stackoverflow.com/questions/644623

复制
相关文章

相似问题

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