vs2010的program.cs文件下面出现集合已修改,可能无法执行枚举操作

qq_39258463 2019-02-25 10:07:28

代码里面没有用到foreach,串口接收事件的代码如下:
 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{

double temp0, temp1, temp2, temp3, temp4, temp5;
int i = 0;

for (i = 1; i < serialPort1.BytesToRead; i++)
{
//byte[] b = new byte[1000];
// reC = Convert.ToByte(serialPort1.Read(b, 1, serialPort1.BytesToRead));
reC = Convert.ToByte(serialPort1.ReadByte());

if (((int)reC == 221) && (rflag == 0))
{
rflag = 1;
rcount = 1;
}
if ((rflag == 1) && (rcount < 9))
{
reInt[rcount - 1] = (int)reC;
rcount = rcount + 1;
}
if (rcount == 9)
{
rflag = 0;
rcount = 0;
// 计算角速度
TLAngle = reInt[1] + reInt[3] * 256 + reInt[2] * 256 * 256;
if ((reInt[2] & 128) == 128)
{
long x = 0xFF000000;
int y = (int)x;
TLAngle = TLAngle | y;
}
TTLFlag = reInt[7] >> 7 & 1;
LocaFlag = reInt[7] >> 6 & 1;
if (LocaFlag == 1)
LocaCount = LocaCount + 1;

if (LocaCount > 1)
{
if (Convert.ToSingle(dataGridView1[4, DrawR - 1].Value) < 9)
{
LocaFlag = 0;
LocaCount = LocaCount - 1;
}
}
if ((LocaCount == 1) && (locSt == 0) && (LocaFlag == 1))
{
if (XX > 1)
{
System.Timers.Timer timer1 = new System.Timers.Timer();
timer1.Elapsed += new ElapsedEventHandler(timer1_Tick);
UpCount_old = all_Num;
Theta_st = Math.Atan(Convert.ToSingle(dataGridView1[5, DrawR - 2].Value) / Convert.ToSingle(dataGridView1[4, DrawR - 2].Value));
DrawGrid_st = DrawR - 1;
dataGridView1[4, DrawR - 1].Value = '0'; // XX
dataGridView1[5, DrawR - 1].Value = '0'; // YY
XX = '0'; // 避免画出预行进距离
YY = '0';
//timer1.Interval = 4;
// timer1.Enabled = false;
timer1.Enabled = true;
pre_route_flag = 1;
locSt = 1;
}
else
{
LocaFlag = 0; // 避免预跑过程中,出现其它位置传感器
LocaCount = LocaCount - 1;
}
}
if ((LocaCount > 1) && ((all_Num - UpCount_old) > 1000) && (locSt == 1))
{
timer1.Enabled = false;
DrawGrid_ed = DrawR - 1;
//dataGridView1[6,DrawR - 1].Value = "第二个位置传感器";
Theta_ed = Math.Atan(Convert.ToSingle(dataGridView1[5, DrawR - 1].Value) / Convert.ToSingle(dataGridView1[4, DrawR - 1].Value));
locSt = 2;
//button3_Click(this,e);
//break;
}
reInt[7] = reInt[7] & 0x3F;
TLTime_orig = reInt[4] + reInt[5] * 256 + reInt[6] * 256 * 256 + reInt[7] * 256 * 256 * 256;
all_Num = all_Num + 1;
Inst_TLAngle = TLAngle / Convert.ToSingle(118245);
if ((TTLFlag == 1) && (UpCount == 0))
{
dataGridView1[2, 0].Value = Convert.ToString(Inst_TLAngle); //陀螺值
UpCount = UpCount + 1;
if ((TLTime_orig - TLTime_orig_old) > 200)
TLTime_orig = TLTime_orig_old + 27;
TTL_Time_st = TLTime_orig;
}
if ((TTLFlag == 0) && (UpCount > 0))
{
avg_TLAngle = avg_TLAngle + Inst_TLAngle;
UpCount = UpCount + 1;
}
if ((TTLFlag == 1) && (UpCount > 0))
{
if ((TLTime_orig - TLTime_orig_old) > 200)
TLTime_orig = TLTime_orig_old + 27;
TTL_Time_ed = TLTime_orig;

if ((TTL_Time_ed > TTL_Time_st))
{
//int index = this.dataGridView1.Rows.Add();
//dataGridView1[0,DrawR].Value = DrawR+1; // 序号
//Thread invokethread = new Thread(new ThreadStart(StartMethod));
//invokethread.IsBackground = true;
//invokethread.Start();
//var act = new Action(StartMethod);
//act.BeginInvoke(ar => act.EndInvoke(ar), null);
DrawR = this.dataGridView1.Rows.Add();

dataGridView1[6, DrawR].Value = DateTime.Now.ToString();

dataGridView1[0, DrawR].Value = Convert.ToString(DrawR + 1);//序号

//DataGridViewRow newrow = dataGridView1.Rows[index];
//DrawR = index;
//newrow.Cells[0].Value = dataGridView1.RowCount;
Timedis = TTL_Time_ed - TTL_Time_st;
//dataGridView1[1,DrawR-1].Value = Timedis;// 时间间隔
dataGridView1[1, DrawR].Value = Convert.ToString(Timedis);// 时间间隔

avg_TLAngle = (avg_TLAngle + Inst_TLAngle) / (UpCount);
//dataGridView1[2, DrawR].Value = avg_TLAngle; //陀螺值
dataGridView1[2, DrawR].Value = Convert.ToString(avg_TLAngle); //陀螺值



temp2 = Convert.ToSingle(dataGridView1[1, DrawR - 1].Value); // 时间间隔
temp1 = Convert.ToSingle(dataGridView1[2, DrawR - 1].Value); // 陀螺值


temp3 = Convert.ToSingle(dataGridView1[3, DrawR - 1].Value); //角度
temp4 = Convert.ToSingle(dataGridView1[4, DrawR - 1].Value); // XX
temp5 = Convert.ToSingle(dataGridView1[5, DrawR - 1].Value); // YY

temp0 = temp3 + (temp1 - earth_eagle) * temp2 / 7.8 / 1000;//////////////////////////////注意double与float类型
dataGridView1[3, DrawR].Value = Convert.ToString(temp0); // 角度

XX = temp4 + car_plus * Math.Cos(temp0 * 3.1415926 / 180 - Theta_st);
dataGridView1[4, DrawR].Value = Convert.ToString(XX); // XX

YY = temp5 + car_plus * Math.Sin(temp0 * 3.1415926 / 180 - Theta_st);
dataGridView1[5, DrawR].Value = Convert.ToString(YY); ; // YY
TTL_Time_st = TTL_Time_ed;
avg_TLAngle = 0;

//DrawR = this.dataGridView1.Rows.Add();
//DrawR = DrawR+1;

UpCount = 1;
}
}
if (all_Num == 1)

TLTime_orig_old = TLTime_orig;

if (all_Num > 1)
{
if ((TLTime_orig - TLTime_orig_old) > 200)
{
TLTime_orig_old = TLTime_orig + 27;
}
else

TLTime_orig_old = TLTime_orig;

}
}
}
}
...全文
140 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2019-02-25
  • 打赏
  • 举报
回复
一般集合被修改,可能在for里面, 增加或者删除了集合元素,导致集合的长度变更了。
圣殿骑士18 2019-02-25
  • 打赏
  • 举报
回复
Form form1 = new Form();
Application.Run(new form1());

你new两次干嘛,第二次再new 一个实例,你确定这能通过编译?

==========
欢迎关注微信公众号 “产品技术知与行” ,打造全面的结构化知识库,包括原创文章、免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。
最新文章:解读经典《C#高级编程》 第四章之继承.接口 https://mp.weixin.qq.com/s/fO4C0WAYZUJYEvKJiBCuVA
qq_39258463 2019-02-25
  • 打赏
  • 举报
回复
问题解决了,是定时器同步的问题,加上timer1.SynchronizingObject = this;就可以了,谢谢各位!
北京.NET 2019-02-25
  • 打赏
  • 举报
回复
program.cs 这里是没有错误的
错误的是地方是new form1() 在这个form1 窗体里面某个函数报错了,自己在form1 的构造函数 打上断点调试

110,548

社区成员

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

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

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