C#串口的BytesToRead属性

https://www.cnblogs.com/TrueElement/archive/2012/07/19/2598972.html

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

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

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

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

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


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


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

发布了115 篇原创文章 · 获赞 20 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/u014683488/article/details/104418831