C#串口的BytesToRead属性

    今天调试串口,发现BytesToRead可以比ReadBufferSize属性值大,而且这个大不是表面数值上的大,实际数据也没有丢失。

查了MSDN SerialPort. BytesToRead 属性 发现如下说明:

由于 ReadBufferSize 属性只表示 Windows 创建的缓冲区,而 BytesToRead 属性除了表示 Windows 创建的缓冲区外还表示 SerialPort 缓冲区,
所以 BytesToRead 属性可以返回一个比 ReadBufferSize 属性大的值。

  接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象自身的内部缓冲。

 那么串行驱动程序的缓冲区到底有多大呢?没有搜索到,试了一下,可以大于65K,之后没再试了。


    另外,对于SerialPort.DataReceived 事件,假如一次事件的处理中,还没处理完,输入缓冲区又达到了SerialPort.ReceivedBytesThreshold的大小,此时不会再执行多一次DataReceived处理函数(即不会同时有两个DataReceived线程在运行),只有当前一次的处理完了之后,再从头执行DataReceived方法。假如一直这样的话,程序运行倒不会有问题,只是当接收的未处理的数据量大于缓冲区的大小时,数据将丢失。


    对于这种情况,觉得比较好的是在DataReceived里面再专门开一个线程,用于处理数据。DataReceived只负责接收。

posted @ 2012-07-19 11:35  果壳中的宇宙  阅读(14458)  评论(3编辑  收藏  举报