C# 串口数据接收超界限

莫o 2018-07-13 03:22:35


发送端数据确保是都发送出来,就是有时候上位机接收提示数组超界限 有时候又不会
...全文
470 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

System.Windows.Forms.DataGridView dataGridView1 = new System.Windows.Forms.DataGridView();
int ReceiveData_Length = (new Random(DateTime.Now.Millisecond)).Next(1000);//我就不做tcp了我生成一个随机长度吧
int left = 0;
for (int i = 0; i < Math.DivRem(ReceiveData_Length, 8,out left)+1; i++)//先整除8并求余数确定一个总列数
{
for (int j = 0; j < 8; j++)
{
if (i * 8 + j < ReceiveData_Length)
{
dataGridView1.Rows[i].Cells[j].Value = i * 8 + j;//在读取范围内的就赋值,你的赋值当然是ReceiveData[i * 8 + j]
}
else
{
dataGridView1.Rows[i].Cells[j].Value = 0;//如果超出范围的部分就给个0或者其他值
}
}
}
//这样就可以实现每行8个数据了。
wanghui0380 2018-07-18
  • 打赏
  • 举报
回复
一共是 1560个 数据 基本每次都是在400左右 报数组超界限或者1000左右

哎,400左右。401是8的倍数么,你每次循环就取8个,我想问一下姑且不论你代码有其他错误没有。就单单这里来看,当你最后一次进去的时候你认为 401%8=1 也就是你顶多在玩一次i+1,后面你超索引

话说这玩意是stream流,你必须当流看,别认为人家发一次你就收一次,而且每一次都是你逻辑上的8的倍数字节。极端情况下甚至你第一个包都错
莫o 2018-07-18
  • 打赏
  • 举报
回复
引用 14 楼 wanghui0380 的回复:
你先保证你真能每次都接收到50字节么??串口接收实际是流,他可不保证你每次接收都是一个固定字节

比如你有8列,你真能保证每次接收的数据刚好是8*N字节

一共是 1560个 数据 基本每次都是在400左右 报数组超界限或者1000左右,
莫o 2018-07-18
  • 打赏
  • 举报
回复
引用 13 楼 jhone99 的回复:
你 for (int i = 0; i < ReceiveData.Length; i++) 这里已经有 i++了,在循环体里再 i+=1,你这个 i 已经改变了,是你想要的逻辑么?
恩 是的 i for 循环改变是我所需求的 数据排列依次添加到指定的数据表格内
wanghui0380 2018-07-16
  • 打赏
  • 举报
回复
你先保证你真能每次都接收到50字节么??串口接收实际是流,他可不保证你每次接收都是一个固定字节

比如你有8列,你真能保证每次接收的数据刚好是8*N字节
jhone99 2018-07-16
  • 打赏
  • 举报
回复
你 for (int i = 0; i < ReceiveData.Length; i++) 这里已经有 i++了,在循环体里再 i+=1,你这个 i 已经改变了,是你想要的逻辑么?
qq_39106738 2018-07-16
  • 打赏
  • 举报
回复
直接判断i ,i+1 肯定超过数组索引了
莫o 2018-07-14
  • 打赏
  • 举报
回复
引用 9 楼 qiaohuyue 的回复:
区索引 不能用 i+=1
哦哦,我跟下位机 串口通讯数据排列依次写入dataGridView1 就只能想到用这个办法递增写入了
莫o 2018-07-14
  • 打赏
  • 举报
回复
引用 7 楼 zhoujg751206 的回复:
i+=1 有时候会超越ReceiveData
很简单加上一行判断 if(i+1< ReceiveData.length)
{

}
恩 好的 谢谢
莫o 2018-07-14
  • 打赏
  • 举报
回复
引用 5 楼 jhone99 的回复:
应该代码是这样,你那算歪打正着
            int index = this.dataGridView1.Rows.Add();
for (int i = 0; i < ReceiveData.Length; i++)
{
this.dataGridView1.Rows[index].Cells[i].Value = ReceiveData[i];
}

你这个是列行自动增加 我是需要固定列导入一定量的数据 一共 8列 195行
XBodhi. 2018-07-13
  • 打赏
  • 举报
回复
区索引 不能用 i+=1
  • 打赏
  • 举报
回复
数组边界的判断都要很小心。不判断光jia自然不行。有时候超出去了
  • 打赏
  • 举报
回复
i+=1 有时候会超越ReceiveData
很简单加上一行判断 if(i+1< ReceiveData.length)
{

}
维秀斯丢丢 2018-07-13
  • 打赏
  • 举报
回复
i+=1 ................................
jhone99 2018-07-13
  • 打赏
  • 举报
回复
应该代码是这样,你那算歪打正着
            int index = this.dataGridView1.Rows.Add();
for (int i = 0; i < ReceiveData.Length; i++)
{
this.dataGridView1.Rows[index].Cells[i].Value = ReceiveData[i];
}
莫o 2018-07-13
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
问题出在
var num = spBytesToRead;
因为串口收到的数据长度可能不是完整的一帧
如果不管接收的长短
然后挨个去解析填到DataGirdView中
就会出现越界

解决方法是:
将接收数据放到线程安全的容器中
再起个线程来进行数据分包,确认是完整的一帧再解析并显示

好的 我试下 谢谢
莫o 2018-07-13
  • 打赏
  • 举报
回复
引用 1 楼 jhone99 的回复:
你代码矛盾了,你for循环 是 i,里面又 i+=1


一共 8组数据 循环导入数据表格 i+=1 是标识数据依次排列添加到数组列表 (1-8)(2-9)这样排列导入
xian_wwq 2018-07-13
  • 打赏
  • 举报
回复
问题出在
var num = spBytesToRead;
因为串口收到的数据长度可能不是完整的一帧
如果不管接收的长短
然后挨个去解析填到DataGirdView中
就会出现越界

解决方法是:
将接收数据放到线程安全的容器中
再起个线程来进行数据分包,确认是完整的一帧再解析并显示
jhone99 2018-07-13
  • 打赏
  • 举报
回复
你代码矛盾了,你for循环 是 i,里面又 i+=1

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧