我只是回顾一下我编写的一些代码,以便在CF2.0上与C#中的串口通信。我不使用DataReceived事件,因为它不可靠。MSDN指出:
对于接收到的每个字节,都不会引发DataReceived事件。使用BytesToRead属性确定缓冲区中要读取的数据数量。
我使用read()轮询端口,并有一个委托在读取数据时处理数据。我还在某个地方读到“轮询是不好的”(没有给出解释)。
你知道为什么投票可能会很糟糕吗?除了通常的线程警告-我有一个单独的线程(后台线程)轮询端口,线程退出后,数据被读取,所有测试和工作良好。
发布于 2009-03-13 21:06:27
按照我的阅读方式,您可能会得到多个字节的一个事件,而不是每个字节一个事件。当数据准备好时,我仍然希望得到一个事件,而不是让它“跳过”一些字节。
我一直在利用这个事件,而且没有遇到任何麻烦。
发布于 2009-03-13 21:08:20
传统观点认为,“轮询是不好的”,因为它最终往往是一个CPU绑定的进程。如果使用阻塞I/O,则CPU可用于其他进程,直到事件发生为止。
也就是说,通常可以设置一些内容,以便在没有可用字符的情况下,在返回之前,轮询等待(短)超时。如果选择了合适的超时,那么简单的轮询循环使用的CPU时间要少得多,其他进程也可以运行。
我根本没有使用过来自C#的串行端口,但我要猜测一下文档的含义是什么
对于接收到的每个字节,都不能保证引发DataReceived事件。使用BytesToRead属性确定缓冲区中要读取的数据数量。
你不能指望每个角色都有一个事件。在某些情况下,它可能提供具有多个可用字符的事件。只需检索事件处理程序中的所有可用字符,就可以了。
编辑:对读取器线程执行阻塞调用的可能是总体上最好的答案。这本身并不是轮询,因为线程在字符到达之前被阻塞。如果您需要在数据到达时处理数据,而不是按固定大小的块处理数据,则可能需要调整缓冲区大小和一些串行端口设置。
发布于 2010-07-25 18:50:32
我确信底层的串口驱动程序代码是中断驱动的,即使在使用阻塞读取调用时也是如此。
https://stackoverflow.com/questions/644623
复制相似问题