功能:串口解析命令,接收ARM板发过来的波长4字节16进制数据,然后把它转成浮点数,最后将浮点数的波长动态作图显示出来。出现问题: 接收到的波长数据99%,绝大部分显示,作图都是正常的,但是有时候波长会出现少量负数,而且有时候接收到的FBG数量不正常,。问题分析:有可能2个原因:
1.接收数据本身的问题。
2.4字节16进制数,转化成浮点数的问题。协议说明:
命令名称        帧头    命令类型       长度字节          命令数据
发送波长数据   FE+FE       A2       依据FBG数量而定      波长数据
 
   波长数据:增益及光开关通道(1字节)+FBG数量(1字节)+波长数据(四字节32位浮点数),其中“增益及光开关通道”字节 的最高位“1”表示高增益,“0”表示低增益,低五位表示当前光开关通道。
    请各位大侠,高手给我帮忙,看一下。今天就要交产品了,就剩下这么个问题。
代码如下:void CCommWizardDlg::OnOnCommCommctrl() 
{
 // TODO: Add your control notification handler code here
 VARIANT variant_inp;
 COleSafeArray safearray_inp;
 LONG len,k;
float f[i]=20;
 int i;
 unsigned char  rxdata[20480]; //设置BYTE数组 An 8-bit integerthat is not signed.
 CString strtemp;
 CString strtemp1;
 CString data;
 CString data1;
 CString s1;
 CString s2;
    double Spectrall;
 unsigned char *q=new unsigned char[20];
 unsigned char *p=new unsigned char[20000];
if(bReceive)
 {
  if(m_Com.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符
  {
   for(i=0;i<20;i++)
 {
  f[i]=0;
 }
   variant_inp = m_Com.GetInput();   //读缓冲区
   safearray_inp = variant_inp;           //VARIANT型变量转换为ColeSafeArray型变量
   len=safearray_inp.GetOneDimSize(); //得到有效数据长度
   for(k=0;k<len;k++)
    safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
      
   for(k=0;k<len;k++)             //将数组转换为Cstring型变量
   {
   unsigned char bt=*(BYTE*)(rxdata+k);      //字符型
          p[k]=bt;     strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放   */
    strtemp1.Format("%02X",bt);
                data+=strtemp;
    data1+=strtemp1;    }
 if((p[0]==0xFE)&&(p[1]==0xFE)&&(p[2]==0xA2)&&(p[3]==0x0E)&&(p[4]==0x80)) 
 {
    if(bochang)  //开关变量
    {
     
        m_fbg=(int)p[5];
  m_ctrlChart2.GetPage().SetMaxPointsPerPage(200);
        m_ctrlChart2.GetAxis().GetLeft().SetMinMax(1528,1560);
 
  len4=p[5]; //第5位表示波长个数
  
     
  for(i=0;i<len4;i++)   //从波长数据帧第6位开始每取4位字节,转化成浮点数,保存在f[i]中
   {
           
    q[0]=p[6+4*i];
   q[1]=p[7+4*i];
   q[2]=p[8+4*i];
   q[3]=p[9+4*i];
 
   WORD lowpart=MAKEWORD(q[0],q[1]);
   WORD highpart=MAKEWORD(q[2],q[3]);
   DWORD dwFinal=MAKEWPARAM(lowpart,highpart);  
   memcpy(&Spectrall,&dwFinal,sizeof(DWORD));  //转化成浮点数
   f[i]=Spectrall+1528;
   m_ctrlChart2.AddSeries(0);
}
switch(m_fbg)    //将波长显示在编辑框m_gp1,m_gp2...中
 {
  case 1:
   m_gp1=f[0];
   UpdateData(FALSE);  
   break;
   
  case 2:
   m_gp1=f[0];
   m_gp2=f[1];
   UpdateData(FALSE);  
   break;
  case 3:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   UpdateData(FALSE);  
   break;
        case 4:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   UpdateData(FALSE);  
   break;
  case 5:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   UpdateData(FALSE);  
   break;  case 6:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   UpdateData(FALSE);  
   break;
  case 7:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   UpdateData(FALSE);  
   break;
        case 8:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   UpdateData(FALSE);  
   break;
  case 9:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   UpdateData(FALSE);  
   break;
  case 10:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   m_gp3=f[9];
   UpdateData(FALSE);  
   break;
  case 11:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   m_gp3=f[9];
   m_gp4=f[10];
   UpdateData(FALSE);  
   break;
  case 12:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   m_gp3=f[9];
   m_gp4=f[10];
   m_gp5=f[11];
   UpdateData(FALSE);  
   break;
  case 13:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   m_gp3=f[9];
   m_gp4=f[10];
   m_gp5=f[11];
   m_gp6=f[12];
   UpdateData(FALSE);  
   break;
  case 14:
   m_gp1=f[0];
   m_gp2=f[1];
   m_gp3=f[2];
   m_gp4=f[3];
   m_gp5=f[4];
   m_gp6=f[5];
   m_gp7=f[6];
   m_gp1=f[7];
   m_gp2=f[8];
   m_gp3=f[9];
   m_gp4=f[10];
   m_gp5=f[11];
   m_gp6=f[12];
   m_gp7=f[13];
   UpdateData(FALSE);  
   break;
  default:
   break;
  
 } 
.........}
}
]

解决方案 »

  1.   

    1.代码太长,看不下去
    2.怎么感觉是个外包项目(修改BUG的项目,只是猜测啊,楼主别介意,也有可能是测试团队很专业),BUG说明很详细啊
    3.最好找到更具体的出错代码,太长了
      

  2.   

    shenyi0106,你好,能帮我看一下吗?主要的应该就是解析,或者使用内存拷贝函数转化成浮点数的地方出了问题。
    功能:串口解析命令,接收ARM板发过来的波长4字节16进制数据,然后把它转成浮点数,最后将浮点数的波长动态作图显示出来。出现问题: 接收到的波长数据99%,绝大部分显示,作图都是正常的,但是有时候波长会出现少量负数,而且有时候接收到的FBG数量不正常,。问题分析:有可能2个原因:
    1.接收数据本身的问题。
    2.4字节16进制数,转化成浮点数的问题。协议说明:
    命令名称 帧头 命令类型 长度字节 命令数据
    发送波长数据 FE+FE A2 依据FBG数量而定 波长数据
      
      波长数据:增益及光开关通道(1字节)+FBG数量(1字节)+波长数据(四字节32位浮点数),其中“增益及光开关通道”字节 的最高位“1”表示高增益,“0”表示低增益,低五位表示当前光开关通道。
      请各位大侠,高手给我帮忙,看一下。今天就要交产品了,就剩下这么个问题。
    代码如下:void CCommWizardDlg::OnOnCommCommctrl()  
    {
     // TODO: Add your control notification handler code here
     VARIANT variant_inp;
     COleSafeArray safearray_inp;
     LONG len,k;
    float f[i]=20;
     int i;
     unsigned char rxdata[20480]; //设置BYTE数组 An 8-bit integerthat is not signed.
     CString strtemp;
     CString strtemp1;
     CString data;
     CString data1;
     CString s1;
     CString s2;
      double Spectrall;
     unsigned char *q=new unsigned char[20];
     unsigned char *p=new unsigned char[20000];
    if(bReceive)
     {
      if(m_Com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
      {
      for(i=0;i<20;i++)
     {
      f[i]=0;
     }
      variant_inp = m_Com.GetInput(); //读缓冲区
      safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
      len=safearray_inp.GetOneDimSize(); //得到有效数据长度
      for(k=0;k<len;k++)
      safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
            
      for(k=0;k<len;k++) //将数组转换为Cstring型变量
      {
      unsigned char bt=*(BYTE*)(rxdata+k); //字符型
      p[k]=bt;  strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 */
      strtemp1.Format("%02X",bt);
      data+=strtemp;
      data1+=strtemp1;  }
     if((p[0]==0xFE)&&(p[1]==0xFE)&&(p[2]==0xA2)&&(p[3]==0x0E)&&(p[4]==0x80))  
     {
      if(bochang) //开关变量
      {
        
      m_fbg=(int)p[5];
      m_ctrlChart2.GetPage().SetMaxPointsPerPage(200);
      m_ctrlChart2.GetAxis().GetLeft().SetMinMax(1528,1560);
      
      len4=p[5]; //第5位表示波长个数
       
        
      for(i=0;i<len4;i++) //从波长数据帧第6位开始每取4位字节,转化成浮点数,保存在f[i]中
      {
        
      q[0]=p[6+4*i];
      q[1]=p[7+4*i];
      q[2]=p[8+4*i];
      q[3]=p[9+4*i];
      
      WORD lowpart=MAKEWORD(q[0],q[1]);
      WORD highpart=MAKEWORD(q[2],q[3]);
      DWORD dwFinal=MAKEWPARAM(lowpart,highpart);   
      memcpy(&Spectrall,&dwFinal,sizeof(DWORD)); //转化成浮点数
      f[i]=Spectrall+1528;
      m_ctrlChart2.AddSeries(0);
    }
    }