我正在调试一些串行内容,其重要部分是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网站上阅读了这两页,ReadBufferSize和BytesToRead
任何人,请指正。如何从4K缓冲区中获得近8K的字节?
答案 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对象分配的内存。