⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串口接受程序.cpp

📁 串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////
// 串口接受程序
//////////////////////////////////////////////////////////////////////

#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 + -