首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为何数据没有显示呢

2012-06-30 
为什么数据没有显示呢?我这里做得一个程序是基于单文档MFC的。要实现同时打开2个串口,比方说COM1和COM3,COM

为什么数据没有显示呢?
我这里做得一个程序是基于单文档MFC的。要实现同时打开2个串口,比方说COM1和COM3,COM1接一个GPS接收机,COM3接其他设备。串口是用CSERIALPORT类实现。GPS接收机是以ASC码的形式发送数据过来的,我也编写了解包函数,可是为什么什么都不显示呢? 比方说接收机的一帧数据如下:$GPGGA,061809.000000000,3201.661425,N,11851.255901,E,1,06,1.3,32.722020,M,,M,,,2.9*49
可界面里都是显示0。。。。请各位大神帮我看看我的程序哪里出了问题呢?(我自己怀疑解包可能有点问题,或许又不是。。。郁闷哦)

我这样强制转换的方式不知道可以么?



下面是程序代码:
NAC.CPP
void CNAVApp::ParseProtocal(WPARAM ch)
{
int i;
if(RCV_Count == 1 && RCV_Buf[0] != '$') 
{
for(i=0;i<RCV_Count;i++)
{
RCV_Buf[i] = 0;
}
RCV_Count = 0;
}

if(RCV_Count >= BUFMAX)
{
for(i=0;i<RCV_Count;i++)
{
RCV_Buf[i] = 0;
}
RCV_Count = 0;
}

RCV_Buf[RCV_Count]=ch;
RCV_Count++;

if(RCV_Buf[0] == '$' && RCV_Count>=6 && RCV_Buf[RCV_Count-2] == CR && RCV_Buf[RCV_Count-1] == LF)
{
if(RCV_Buf[3]=='G' && RCV_Buf[4]=='G' && RCV_Buf[5]=='A')
{
ParseProtocal_GGA();
}
else if(RCV_Buf[3]=='G' && RCV_Buf[4]=='S' && RCV_Buf[5]=='V')
{
ParseProtocal_GSV();
}
else if(RCV_Buf[3]=='D' && RCV_Buf[4]=='H' && RCV_Buf[5]=='V')
{
ParseProtocal_DHV();
}
else if(RCV_Buf[3]=='P' && RCV_Buf[4]=='R' && RCV_Buf[5]=='O')
{
ParseProtocal_PRO();
}
else if(RCV_Buf[3]=='G' && RCV_Buf[4]=='L' && RCV_Buf[5]=='L')
{
ParseProtocal_GLL();
}
else if(RCV_Buf[3]=='E' && RCV_Buf[4]=='C' && RCV_Buf[5]=='T')
{
ParseProtocal_ECT();
}
}
for(i=0;i<RCV_Count;i++)
{
RCV_Buf[i] = 0;
}
RCV_Count = 0;
}
//////////////////////////////////////////////////////////////////////////
void CNAVApp::ParseProtocal_GGA()
{
/*************************************************************************/
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// | | | | | | | | | | | | | | |  
//$xxGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,U,x.x,U,xxxx,x.x,x.x*hh<CR><LF>
//
//
// 1-定位时间 2-纬度 3-纬度方向 4-经度 5-经度方向 6-状态指示 7-视野内卫星数 8-HDOP值
// 9-天线平均海拔高度 10-天线海拔高单位 11-CGS2000高程异常 12-高程异常单位:米
// 13-差分数据寿命 14-差分站台ID号 15-VDOP值 
/***************************************************************************/
char strbuf[20]="";
char ptr[5]="";
//1
StrAfterComma(1,RCV_Buf,strbuf); 
//c_substr(ptr,strbuf,0,2);
//gga.UTCtime_hh=atoi(ptr);
gga.UTCtime_hh=*(int*)&strbuf[0];
gga.UTCtime_mm=*(int*)&strbuf[2];
gga.UTCtime_ss=*(int*)&strbuf[4];
memset(strbuf,0,20);
 //2
StrAfterComma(2,RCV_Buf,strbuf);
gga.Latitude_deg=*(int*)&strbuf[0];
gga.Latitude_min=*(int*)&strbuf[2];
gga.Latitude_second=(*(double*)&strbuf[4])*60;
memset(strbuf,0,20);
//3
StrAfterComma(3,RCV_Buf,strbuf); 
gga.LatDirection=*(char*)&strbuf[0];
memset(strbuf,0,20);
//4
StrAfterComma(4,RCV_Buf,strbuf); 
gga.Longtitude_deg=*(int*)&strbuf[0];
gga.Longtitude_min=*(int*)&strbuf[2];
gga.Longtitude_second=(*(double*)&strbuf[4])*60;
memset(strbuf,0,20);
//5
StrAfterComma(5,RCV_Buf,strbuf);
gga.LongDirection=*(char*)&strbuf[0];
memset(strbuf,0,20);
//7
StrAfterComma(7,RCV_Buf,strbuf);
gga.SateNumInView=*(int*)&strbuf[0];
memset(strbuf,0,20);
//8
StrAfterComma(8,RCV_Buf,strbuf);
gga.HDOP=*(double*)&strbuf[0];
memset(strbuf,0,20);
//9 
StrAfterComma(9,RCV_Buf,strbuf);
gga.HeightAve=*(double*)&strbuf[0];
memset(strbuf,0,20);
//15


StrAfterComma(15,RCV_Buf,strbuf);
gga.VDOP=*(double*)&strbuf[0];
memset(strbuf,0,20);
}
//////////////////////////////////////////////////////////////////////////
void CNAVApp::ParseProtocal_GSV()
{
/**********************************************************************/
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// | | | | | | | | | | | | | | | | | | |  
// 例: $xxGSV,3,1,10,12,36,116,45,9,50,38,49,24, 0,0,44,25,23,160,44*46<CR><LF>
//
// 1-电文数 2-当前语句号 3-可视卫星数 4-7,8-11,12-15,16-19为(卫星号,仰角,方位角,信噪比)
/**********************************************************************/
char strbuf[20];
memset(strbuf,0,20);
int num=0;
//3
StrAfterComma(3,RCV_Buf,strbuf);
gga.SateNumInView=*(int*)&strbuf[0];
memset(strbuf,0,20);
//4-7,8-11,12-15,16-19
for(int i=1;i<=4;i++)
{
StrAfterComma(4*i,RCV_Buf,strbuf);
num=*(int*)&strbuf[0];
sateinfo_list[num].SateNum=num;
memset(strbuf,0,20);
StrAfterComma(4*i+1,RCV_Buf,strbuf);
sateinfo_list[num].ELangle=*(int*)&strbuf[0];
memset(strbuf,0,20);
StrAfterComma(4*i+2,RCV_Buf,strbuf);
sateinfo_list[num].AZangle=*(int*)&strbuf[0];
memset(strbuf,0,20);
StrAfterComma(4*i+3,RCV_Buf,strbuf);
sateinfo_list[num].SNR=*(int*)&strbuf[0];
memset(strbuf,0,20);
}
}
//////////////////////////////////////////////////////////////////////////
void CNAVApp::ParseProtocal_PRO()
{
/******************************************************************************/
// 1 2 3 4 5 6 7 8
// | | | | | | | |  
//$xxPRO,xxx,c--c,xx,P,x,x.x,x.x,x.x*hh<CR><LF>
//
// 1-卫星号 2-频点号 3-通道号 4-测距类型 5-帧号 6-周内秒计数 7-测距值(伪距) 8-钟差
/*******************************************************************************/
char strbuf[20];
memset(strbuf,0,20);
int num=0;
//1
StrAfterComma(1,RCV_Buf,strbuf);
num=*(int*)&strbuf[0];
sateinfo_list[num].SateNum=num;
memset(strbuf,0,20);
//2
StrAfterComma(2,RCV_Buf,strbuf);
sateinfo_list[num].FreqPoint=strbuf;
memset(strbuf,0,20);
//7
StrAfterComma(7,RCV_Buf,strbuf);
sateinfo_list[num].Pseudo_range=*(double*)&strbuf[0];
memset(strbuf,0,20);
//8
StrAfterComma(8,RCV_Buf,strbuf);
baseinfo.Clock_error=*(double*)&strbuf[0];
memset(strbuf,0,20);
}
//////////////////////////////////////////////////////////////////////////
void CNAVApp::ParseProtocal_DHV()
{
/********************************************************************************/
// 1 2 3 4 5 6 7 8 9 10 11
// | | | | | | | | | | | 
// $xxDHV,hhmmss.ss,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,U*hh<CR><LF>
//
//1-UTC时间 2-速度 3-X轴速度 4-Y轴速度 5-Z轴速度 6-地速 7-最大速度 8-平均速度 9-全程平均速度 
// 10-有效速度 11-速度单位 
/********************************************************************************/
char strbuf[20];
memset(strbuf,0,20);
//2
StrAfterComma(2,RCV_Buf,strbuf);
dhv.V=*(double*)&strbuf[0];
memset(strbuf,0,20);
//3
StrAfterComma(3,RCV_Buf,strbuf);
dhv.Vx=*(double*)&strbuf[0];
memset(strbuf,0,20);
//4
StrAfterComma(4,RCV_Buf,strbuf);
dhv.Vy=*(double*)&strbuf[0];
memset(strbuf,0,20);
//5
StrAfterComma(5,RCV_Buf,strbuf);
dhv.Vz=*(double*)&strbuf[0];
memset(strbuf,0,20);
}

[解决办法]
你怎么不单步调试下了,这样比我们看代码还好
[解决办法]
首先要看你接收到的数据是否和你的协议时相对应的。先看看这个帖子:http://topic.csdn.net/u/20120331/14/8ddd5e9c-9c64-4609-8654-4f29915f741d.html


然后整理一下思路,有问题再提出来。

热点排行