BytesToRead大于ReadBufferSize

时间:2013-01-08 01:17:28

标签: c# serial-port

我正在调试一些串行内容,其重要部分是SerialDataReceivedEventHandler。

我正在观察(通过断点和悬停),读取的字节数几乎是缓冲区大小的两倍。喜欢吧?

这是代码

aUartSemaphoreThatTells.WhatTheUartBackgroundRxIsDoing = (int)aValueWhichIndicatesThat.theUARTisReceivingData;

SerialPort CurrentPort = (SerialPort)sender; //// Int routine gave is this in the arguments

int LastByteInUartBuffer = CurrentPort.ReadBufferSize;
int TheNumberOfBytes = CurrentPort.BytesToRead;
byte[] inputData = new byte[TheNumberOfBytes];
int RenameThisInt = CurrentPort.Read(inputData, 0, TheNumberOfBytes);                 //// This is a C# property method of ports

int Dest;
Dest = UartPlaceHolders.RxBufferLeader; //// Will index into buffer for Chief dispatch

做一点Mouse-Hover-Over告诉我......

  • LastByteInUartBuffer有4096
  • TheNumberOfBytes有8092
  • RenameThisInt有8092
  • inputData有正确的东西

(我知道从串口的另一端看到的数据是什么,因为我自己生成它们)

我在MSDN网站上阅读了这两页,ReadBufferSizeBytesToRead

任何人,请指正。如何从4K缓冲区中获得近8K的字节?

2 个答案:

答案 0 :(得分:1)

请注意SerialPort.ReadBufferSize Property上的这条说明:

  

因为ReadBufferSize属性仅代表   Windows创建的缓冲区,它可以返回比值小的值   BytesToRead属性,表示SerialPort缓冲区和   Windows创建的缓冲区。

答案 1 :(得分:1)

答案实际上在ReadBufferSize的文档中:

  

BytesToRead属性可以返回大于ReadBufferSize属性的值,因为ReadBufferSize属性仅表示Windows创建的缓冲区,而BytesToRead属性表示除了Windows创建的缓冲区之外的SerialPort缓冲区。

在这种情况下,“Windows created buffer”是底层驱动程序内存,而不是C#SerialPort对象分配的内存。