首页 新闻 会员 周边 捐助

BytesToRead串口接收缓冲区数据字节数不对

0
[已解决问题] 解决于 2024-09-20 09:09

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,这是为什么

C#
zolizoli的主页 zolizoli | 初学一级 | 园豆:119
提问于:2024-08-14 09:42
< >
分享
最佳答案
0

是由于数据没接收完整就触发了DataReceivedHandler,导致只有32个数据传入了bytesToRead,延时一会就可以

zolizoli | 初学一级 |园豆:119 | 2024-09-20 09:08
其他回答(2)
0

要不重新编辑一下文字, 看不明白...

czd890 | 园豆:14488 (专家六级) | 2024-08-14 11:24

int bytesToRead = sp.BytesToRead;就是这句代码,明明sp.BytesToRead值为47,为什么赋值给的bytesToRead 是32呢

支持(0) 反对(0) zolizoli | 园豆:119 (初学一级) | 2024-08-14 13:00

@zolizoli: 上截图, 朋友. impossible...

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2024-08-14 13:17

@czd890: 目前解决了,非常感谢。是由于数据没接收完整就触发了DataReceivedHandler,导致只有32个数据传入了bytesToRead

支持(0) 反对(0) zolizoli | 园豆:119 (初学一级) | 2024-08-14 14:55
0

根据您提供的代码,您正在使用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);

}
这样修改后的代码会循环读取数据,并将所有的数据存储在一个更大的缓冲区中。在读取完所有数据后,将根据实际读取的字节数创建一个新的缓冲区,并将数据复制到新缓冲区中。
请注意,上述代码仅供参考,并且可能需要根据您的具体需求进行适当的修改。

Technologyforgood | 园豆:7775 (大侠五级) | 2024-08-15 07:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册