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

C#串口的BytesToRead属性

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

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

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

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

C#串口的BytesToRead属性


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


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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2022-12-23
  • 2021-11-01
猜你喜欢
  • 2021-07-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案