C# BytesToRead大于ReadBufferSize

C# BytesToRead大于ReadBufferSize,c#,serial-port,C#,Serial Port,我正在调试一些串行的东西,重要的部分是SerialDataReceivedEventHandler 我观察到(通过断点和悬停)要读取的字节数几乎是缓冲区大小本身的两倍。像是吧 这是密码 aUartSemaphoreThatTells.WhatTheUartBackgroundRxIsDoing = (int)aValueWhichIndicatesThat.theUARTisReceivingData; SerialPort CurrentPort = (SerialPort)sender;

我正在调试一些串行的东西,重要的部分是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
做一个鼠标悬停告诉我

  • LastByteInUartBuffer
    具有4096
  • 字节数为8092
  • RenameThisInt
    有8092个
  • inputData
    具有正确的内容
(我知道串行端口另一端的数据是什么样子的,因为我自己生成它们)

我在MSDN网站、和上阅读了这两页

任何人,请纠正我。如何从4K缓冲区中提取近8K字节?

请注意以下注意事项:

因为ReadBufferSize属性只表示 Windows创建的缓冲区,它可以返回比 BytesToRead属性,它表示SerialPort缓冲区和 Windows创建了缓冲区


答案实际上在以下文件中:

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


在这种情况下,“Windows创建的缓冲区”是底层驱动程序内存,而不是由C#SerialPort对象分配的内存。

详细信息,哦,小子。那么,这两个缓冲区是什么?它们是相邻的吗?它们能长多大?我已经有一个问题,数据太多,速度太快;这可以进一步阐明以前的神秘行为。我认为微软没有一个页面来解释这些缓冲区是在哪里产生的,或者它们是如何增长的。顺便说一句,谢谢你告诉全世界我有多聪明,因为我错过了我读到的第二句话。我真不敢相信我错过了。无论如何,谢谢你。谦逊是一种令人向往的性格特征。不要担心误读文档——它总是发生的。但是为什么需要知道Windows内部缓冲区的大小呢?难道你不能只读取可用的数据,或者中间缓冲区中有空间容纳的数据(更小的数据),然后迭代直到没有数据了吗?@Internal Server Error,我在一秒钟内发送了64个字节的数据包,一行256次。我必须解构它们,去掉协议开销,将24位有符号整数更改为32位有符号整数,然后将它们传递给一个类,该类将把它们绘制到一系列行上。在这种情况下,4096字节的缓冲区真的帮了我一个忙;i、 例如,我一次可以读取0.25秒的数据;它几乎可以帮我解决我的夜母马问题。现在缺少了100个字节;明智的代码到此为止。您需要一个数据收集队列或其他东西,您可以在其中组装整个数据包(无论在您的上下文中是什么意思),并在准备好完整数据包时将其传递给其他逻辑。这是当前正在进行的方案。难看,但我没有更好的主意。哦,好吧,我们定义协议包括一个长度字节;然后当然是16位和向后。我希望我能为此按小时计酬;比从事法律工作要好/谢谢,谢谢,现在我知道另一个秘密了。我忍不住注意到另一个数字正好比缓冲区大小的两倍少100字节。因为我只是碰巧在每个小数据包中发送了64字节的倍数,Grrr,这真是令人讨厌。