private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
int bytesToRead = sp.BytesToRead;
byte[] buffer = new byte[bytesToRead];
sp.Read(buffer, 0, bytesToRead);
// 判断是否是写入返回的数据
if (buffer.Length > 1 && (buffer[1] == 16 || buffer[1] == 6))
{
return; // 跳出函数
}
Form1.currentPage?.ReceiveData(buffer);
}
其中int bytesToRead = sp.BytesToRead;
这句代码应该是获取接收缓冲区中数据的字节数的大小的,
我在接收到数据后明明sp.BytesToRead里面的数是47或者是其他大于32的某个数(打断点后鼠标停留在BytesToRead上),但执行这一句后只要sp.BytesToRead里的数大于32,bytesToRead 里最大只能为32,这是为什么
是由于数据没接收完整就触发了DataReceivedHandler,导致只有32个数据传入了bytesToRead,延时一会就可以
要不重新编辑一下文字, 看不明白...
int bytesToRead = sp.BytesToRead;就是这句代码,明明sp.BytesToRead值为47,为什么赋值给的bytesToRead 是32呢
@zolizoli: 上截图, 朋友. impossible...
@czd890: 目前解决了,非常感谢。是由于数据没接收完整就触发了DataReceivedHandler,导致只有32个数据传入了bytesToRead
根据您提供的代码,您正在使用SerialPort类来接收串口数据。您观察到当接收缓冲区中的字节数大于32时,变量bytesToRead的值最大只能为32,而不是实际的缓冲区字节数。
这可能是由于SerialPort类中的一些限制引起的。SerialPort类的BytesToRead属性表示接收缓冲区中当前可供读取的字节数。但是,根据操作系统和硬件的不同,此属性的值可能受到一些限制。
为了获取完整的接收缓冲区数据,您可以尝试使用循环来多次读取数据,并将每次读取的数据追加到一个更大的缓冲区中。这样您就可以处理更多的数据,而不仅限于32个字节。
以下是一个修改后的代码示例:
c#
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
int bufferSize = 1024; // 假设一个足够大的缓冲区大小
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
while (sp.BytesToRead > 0)
{
int bytesReadThisTime = sp.Read(buffer, bytesRead, bufferSize - bytesRead);
bytesRead += bytesReadThisTime;
if (bytesRead >= bufferSize)
{
// 缓冲区已满,可以根据实际需求进行处理
break;
}
}
// 根据实际读取的字节数创建新的缓冲区
byte[] receivedData = new byte[bytesRead];
Array.Copy(buffer, receivedData, bytesRead);
// 判断是否是写入返回的数据
if (receivedData.Length > 1 && (receivedData[1] == 16 || receivedData[1] == 6))
{
return; // 跳出函数
}
Form1.currentPage?.ReceiveData(receivedData);
}
这样修改后的代码会循环读取数据,并将所有的数据存储在一个更大的缓冲区中。在读取完所有数据后,将根据实际读取的字节数创建一个新的缓冲区,并将数据复制到新缓冲区中。
请注意,上述代码仅供参考,并且可能需要根据您的具体需求进行适当的修改。