日期:2014-05-18  浏览次数:21014 次

C#串口接收问题
给位大侠,我有一个串口接收问题,每次给单片机发送数据,然后让单片机回发同样的数据给我,用于显示在文本框中,可是我发现当用调试运行的时候数据可以正常显示,但不用调试直接运行时数据就不能正常显示,小弟真不知错在哪儿,以下是我的程序,希望各位不惜指正一下,感激不尽
  void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  try
  {
  buffer.Clear();
  Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。  
  int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致  
  byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据  
  comm.Read(buf, 0, n);//读取缓冲数据  
  //<协议解析>  
  buffer.AddRange(buf);
  bool data_1_catched = false;//缓存记录数据是否捕获到  
  //2.完整性判断  
  zs_sjzhen = new byte[buffer.Count];
  if (buffer.Count >= 4)//至少要包含头(1字节)+命令(1字节)+长度(1字节)+校验(1字节)  
  {

  //2.1 查找数据头  
  if (buffer[0] == 0x7E)
  {
   
  byte checksum = 0;
  for (int i = 0; i < buffer.Count-1; i++)//7表示校验之前的位置  
  {
  checksum ^= buffer[i];
  }
   
  //至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析  

  buffer.CopyTo(0, zs_sjzhen, 0, buffer.Count);//复制一条完整数据到具体的数据缓存  
  data_1_catched = true;
  buffer.RemoveRange(0, buffer.Count);//正确分析一条数据,从缓存中移除数据。  
  }
  else
  {
  //这里是很重要的,如果数据开始不是头,则删除数据  
  buffer.RemoveAt(0);
  }
  }
  //分析数据  
  if (data_1_catched)
  {

  builder.Clear();//清除字符串构造器的内容  
  //因为要访问ui资源,所以需要使用invoke方式同步ui。  
  this.Invoke((EventHandler)(delegate
  {
  //依次的拼接出16进制字符串  
  foreach (byte b in zs_sjzhen)
  {
  builder.Append(b.ToString("X2") + " ");

  }
  //this.richTextBox1.AppendText(builder.ToString());
  data_1_catched = false;
  }));
  this.Invoke((EventHandler)(delegate
  {
  this.richTextBox1.AppendText(builder.ToString());
  // JYT_StartRunning();
  }));

  } 
  }
  finally
  {
  Listening = false;//我用完了,ui可以关闭串口了。  
  }
   
  }

------解决方案--------------------
参考你1L的说法,应该是数据还没有到吧。处理下时间问题。