1

我正在调试一些串行的东西,重要的部分是 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
  • TheNumberOfBytes 有 8092
  • RenameThisInt 有 8092
  • inputData 有合适的东西

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

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

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

4

2 回答 2

1

请注意有关SerialPort.ReadBufferSize 属性的注释:

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

于 2013-01-08T01:24:53.930 回答
1

答案实际上在文档中ReadBufferSize

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

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

于 2013-01-08T01:26:15.807 回答