功能:串口解析命令,接收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.接收数据本身的问题。
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;
}
.........}
}
]
2.怎么感觉是个外包项目(修改BUG的项目,只是猜测啊,楼主别介意,也有可能是测试团队很专业),BUG说明很详细啊
3.最好找到更具体的出错代码,太长了
功能:串口解析命令,接收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);
}
}