?? commport.cpp
字號:
//////////////////////////////////////////////////////////////////////
// 串口接受程序
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CommPort.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//定義全局變量
HANDLE hPort;
int SettingStatus=0;
int ReadFlag=0;
int WriteFlag=0;
unsigned char Result[40960];
unsigned char Message7[155];
unsigned char result[40960];
BOOL GetOrigin=0;
unsigned int dwVisible=0;//當前可見的衛星號
WORD iEl[32];//衛星的仰角
WORD iAz[32];//衛星的方位角
WORD iVs[32];//當前可用的衛星號
double BORDERLENGTH=0.05;
extern int ReceivedNumber;
int ReadByteNumber=0;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCommPort::CCommPort()
{
}
CCommPort::~CCommPort()
{
ClosePort();
}
//////////////////////////////////////////////////////////////////////////////////////
//功能:讀串口數據
//////////////////////////////////////////////////////////////////////////////////////
GPSInfo CCommPort::ReadPortData()
{
GPSInfo gpsinfo;
DWORD dwBytesRead;
// char b[100];
int AllNumber=0;
unsigned char Info[512];
ReadFile(hPort,&Info,512,&dwBytesRead,NULL);
//清除讀緩沖區
ClearCommBuf(2);
if(ReadFlag==0)
{
for(int i=0;i<(int)dwBytesRead;i++)
Result[i]=Info[i];
AllNumber=dwBytesRead;
ReadFlag=0;
int n=0;
while(n<AllNumber-1)
{
//循環找出"$GPGGA"
if(Result[n]=='$'&&Result[n+1]=='G'&&Result[n+2]=='P'&&Result[n+3]=='G'&&Result[n+4]=='G'&&Result[n+5]=='A')
{
//計算CheckSum
char GPGGA[128];
int CheckSum=0;
GPGGA[0]='G';
int m=n+2;
int DataLength=1;
while ((Result[m]!='*')&&(m-n-1)<128)
{
GPGGA[m-n-1]=Result[m];
DataLength++;
m++;
}
/* char c[3]={0,0,0};
c[0]=Result[m+1];
c[1]=Result[m+2];
int RCheckSum=atoi(c);
CheckSum=GPGGA[0];//Calc_checksum(GPGGA, DataLength);
for(i=1;i<DataLength;i++)
CheckSum^=GPGGA[i];
*/
char Degree[4];
char Minute[8];
double Latitude=0.0;
double Longitude=0.0;
int sn=0;
int no=0;
//跳到緯度值的度
no+=16;
for(int i=0;i<4;i++)
Degree[i]=0;
Degree[0]=GPGGA[no];
Degree[1]=GPGGA[no+1];
no+=2;
for(i=0;i<8;i++)
Minute[i]=0;
for(i=0;i<7;i++)
Minute[i]=GPGGA[no+i];
int l=atoi(Degree);
Latitude=(atof(Minute))/60.0+l;
//求出經度
no+=10;
for(i=0;i<4;i++)
Degree[i]=0;
Degree[0]=GPGGA[no];
Degree[1]=GPGGA[no+1];
Degree[2]=GPGGA[no+2];
no+=3;//跳轉到經度值的分
for(i=0;i<8;i++)
Minute[i]=0;
for(i=0;i<7;i++)
Minute[i]=GPGGA[no+i];
int B=atoi(Degree);
Longitude=(atof(Minute))/60.0+B;
///////////////////////////////////////////////
if(Longitude>90.0&&Longitude<130.0&&Latitude>10.0&&Latitude<80.0)
//&&fabs(dL)<0.0006&&fabs(dB)<0.0006
{
gpsinfo.co.B=Latitude;
gpsinfo.co.L=Longitude;
ReceivedNumber++;
}
//跳到衛星顆數
no+=13;
for(i=0;i<4;i++)
Degree[i]=0;
Degree[0]=GPGGA[no];
Degree[1]=GPGGA[no+1];
sn=atoi(Degree);
gpsinfo.sn=sn;
}
//循環找出"$GPGSV"
else if(Result[n]=='$'&&Result[n+1]=='G'&&Result[n+2]=='P'&&Result[n+3]=='G'&&Result[n+4]=='S'&&Result[n+5]=='V')
{
char GPGSV[65];
GPGSV[0]='G';
int m=n+2;
while ((Result[m]!='*')&&(m-n-1)<65)
{
GPGSV[m-n-1]=Result[m];
m++;
}
int temple,temple2;
int no=0;
//求出坐標
for(int i=0;i<4;i++)
{
no=13+13*i;
temple=(GPGSV[no]-48)*10+(GPGSV[no+1]-48)-1;
if((temple>=0)&&(temple<32))
{
iVs[temple]++;
temple2=(GPGSV[no+3]-48)*10+(GPGSV[no+4]-48);
if((temple2>=0)&&(temple2<=90)) iEl[temple]=temple2;
else iEl[temple]=0;
temple2=(GPGSV[no+6]-48)*100+(GPGSV[no+7]-48)*10+(GPGSV[no+8]-48);
if((temple2>=0)&&(temple2<=360)) iAz[temple]=temple2;
else iAz[temple]=0;
}
}
}
//循環找出"$GPGLL"
else if(Result[n]=='$'&&Result[n+1]=='G'&&Result[n+2]=='P'&&Result[n+3]=='G'&&Result[n+4]=='L'&&Result[n+5]=='L')
{
/* //////////////////////////////////////////////////////////////////////////////
// $GPGLL, XXXX.XXXX, N/S, XXXXX.XXXX, E/W,XXXXXX.XX,S,M*hh <CR><LF> //
// 1 2 3 4 5 6 7 8 //
// 1:緯度 //
// 2:N:北緯 S:南緯 //
// 3:經度 //
// 4:E:東經 W:西經 //
// 5:時間 //
// 6:狀態顯示 A可用 V不可用 //
// 7:模式顯示 A自動 N數據不可用 //
// 8:校驗和 //
//////////////////////////////////////////////////////////////////////////////
char GPGLL[128];
GPGLL[0]='G';
int m=n+2;
int DataLength=1;
while (Result[m]!='*')
{
GPGLL[m-n-1]=Result[m];
DataLength++;
m++;
}
char Degree[4];
char Minute[8];
double Latitude=0.0;
double Longitude=0.0;
int no=0;
//跳到緯度值的度
no+=6;
for(int i=0;i<4;i++)
Degree[i]=0;
Degree[0]=GPGLL[no];
Degree[1]=GPGLL[no+1];
no+=2;//跳轉到緯度值的分
for(i=0;i<8;i++)
Minute[i]=0;
for(i=0;i<7;i++)
Minute[i]=GPGLL[no+i];
int l=atoi(Degree);
Latitude=(atof(Minute))/60.0+l;
//求出經度
no+=10;
for(i=0;i<4;i++)
Degree[i]=0;
Degree[0]=GPGLL[no];
Degree[1]=GPGLL[no+1];
Degree[2]=GPGLL[no+2];
no+=3;//跳轉到經度值的分
for(i=0;i<8;i++)
Minute[i]=0;
for(i=0;i<7;i++)
Minute[i]=GPGLL[no+i];
int B=atoi(Degree);
Longitude=(atof(Minute))/60.0+B;
sprintf(b," ");
p->ExtTextOut(5,5,NULL,NULL,b,NULL);
sprintf(b," ",Latitude);
p->ExtTextOut(10,30,NULL,NULL,b,NULL);
sprintf(b," B=%f",Latitude);
p->ExtTextOut(10,30,NULL,NULL,b,NULL);
sprintf(b," ",Longitude);
p->ExtTextOut(10,50,NULL,NULL,b,NULL);
sprintf(b," L=%f",Longitude);
p->ExtTextOut(10,50,NULL,NULL,b,NULL);
*/
}
//循環找出"$GPGGA"
else if(Result[n]=='$'&&Result[n+1]=='G'&&Result[n+2]=='P'&&Result[n+3]=='G'&&Result[n+4]=='S'&&Result[n+5]=='V')
{
}
//循環找出"$GPGSA"
else if(Result[n]=='$'&&Result[n+1]=='G'&&Result[n+2]=='P'&&Result[n+3]=='G'&&Result[n+4]=='S'&&Result[n+5]=='A')
{
char GPGSA[60];
GPGSA[0]='G';
int m=n+2;
while ((Result[m]!='*')&&(m-n-1)<60)
{
GPGSA[m-n-1]=Result[m];
m++;
}
int temple3,no;
no=10;
for(int i=0;i<12;i++)
{
if(GPGSA[no+1+i*3]!='.')
{
temple3=(GPGSA[no+i*3]-48)*10+(GPGSA[no+1+i*3]-48)-1;
if((temple3>=0)&&(temple3<32)) iVs[temple3]++;
}
if(GPGSA[no+1+i*3]=='.') i=12;
}
}
n++;
}
}
return gpsinfo;
}
#define BORDERPIXEL 240.0
#define REFX 0
#define REFY 0
//////////////////////////////////////////////////////////////////////////
//功能:初始化串口
//////////////////////////////////////////////////////////////////////////
BOOL CCommPort::InitGPS()
{
CString ComName;
FILE *fp;
fp=fopen("GPSPort.dat","r");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -