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

接收串口的数组数据不正确如何解决??
---begind
/****************这是数据类************/
  private byte[] testw;//写
  public byte[] testr;//读


  //发送数据
  public short SetParameter(byte addr, byte value, byte ReaderAddr)
  {
  short result = -1;
  try
  {
  this.testw = new byte[8];
  this.testw[0] = 0xAA;
  this.testw[1] = ReaderAddr;
  this.testw[2] = 5;
  this.testw[3] = CMD.PID_GET_PARAMETER;
  this.testw[5] = addr;
  this.testw[6] = value;
  this.testw[this.testw.Length - 1] = this.Last(this.testw);
  this.spt.Write(this.testw, 0, this.testw.Length);//串口自身的方法发送数据
  result = 0;
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }
  return result;
  }

  //由 DataReceived 事件接收数据
  private void spt_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  try
  {
  this.spt.BaseStream.Flush();
  int j = this.spt.BytesToRead;
  testr = new byte[j];
  this.spt.Read(testr, 0, j);//把数据读入数组中
  this.spt.BaseStream.Flush();
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  this.spt.BaseStream.Close();
  }
  }


/****************这是测试类************/
  byte[] test;
//把上面的数据类创建对象,下面调用方法
  UserControl1 uc = new UserControl1();
  private void button2_Click(object sender, EventArgs e)
  {
  try
  {
  short k = 0;
  k = uc.DrfCommOpen("COM1"); //这是打开串口的方法,已经成功
  if (k == 0)
  {
  k = uc.SetParameter(0xC1, 20, 0xFF);//这个是问题的所在
  if (k == 0)
  {
test = testr; //把数据类的数组传给本类的数组
this.label2.Text = "";
foreach (byte rr in test)
{
this.label2.Text += rr.ToString() + " ";
}
  }
  }
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }
  }
---end

前提,所有硬件都正常连接并工作。
可是有一个很奇怪的问题,串口监测工具(如AccessPort、串口调试助手等)明明显示有数据返回,也就是说数据类的testr数组已经存有数据了,可是测试类的test数组接收的东西却不相符,具体情况是这样的,第1次点击按钮时,引发异常数组超出下标,第2次点击按钮才读到正确的东西,也就是说要点击2次按钮才能得到数据,这样的现象不正常。请问高手该如何解决此问题,第一次接触串口的开发,请诸位多指教。

------解决方案--------------------
完整的c++串口编程源代码

希望能帮点忙

------解决方案--------------------
是不是要在使用之前就清空数据的缓冲区啊
------解决方案--------------------
串口是要先设置后打开的,不然就会出现古怪的错误
------解决方案--------------------
先设置后打开.
可以这样:
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;