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

📄 gn74w.c

📁 用C写的GPS测试软件
💻 C
📖 第 1 页 / 共 3 页
字号:
#include"gn74w.h"


#define PI 3.14159265359

struct POINT {
	int x;
	int y;
}IPOINT;
VOID NEAR FillComboBox( HINSTANCE,HWND,WORD NEAR*,WORD,WORD);
BOOL FAR PASCAL _export DialogWndProc(HWND,UINT,UINT,LONG);
POINT  CoordinateTransform(int ,int );
int  PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
{                                                    
	HWND 		hWnd;
	MSG  		msg;
	WNDCLASS 	wndclass,wcMess,wcchild;
	
	if(!hPrevInstance)
	{
		wndclass.style  		= CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
		wndclass.lpfnWndProc	= WndProc;
		wndclass.cbClsExtra 	= 0;
		wndclass.cbWndExtra 	= 0;
		wndclass.hInstance 		= hInstance;
		wndclass.hIcon 			= LoadIcon(hInstance,(LPCSTR)IDI_DHICON);
		wndclass.hCursor 		= LoadCursor(NULL ,IDC_ARROW);
		wndclass.hbrBackground 	= GetStockObject(WHITE_BRUSH);
		wndclass.lpszMenuName 	= "GN74W";
		wndclass.lpszClassName 	= szAppName;

		wcMess.style = CS_HREDRAW |CS_VREDRAW  | CS_PARENTDC;
		wcMess.lpfnWndProc = MessWndProc;
		wcMess.cbClsExtra = 0;
		wcMess.cbWndExtra = 0;
		wcMess.hInstance = hInstance;
		wcMess.hIcon = LoadIcon(hInstance,(LPCSTR)IDI_DHICON);
		wcMess.hCursor = LoadCursor(NULL, IDC_ARROW);
		wcMess.hbrBackground = GetStockObject(WHITE_BRUSH);
		wcMess.lpszMenuName =NULL;
		wcMess.lpszClassName = "MessageW";

		wcchild.style = CS_HREDRAW |CS_VREDRAW|CS_SAVEBITS|CS_PARENTDC|CS_DBLCLKS;
		wcchild.lpfnWndProc = ChildWndProc;
		wcchild.cbClsExtra = 0;
		wcchild.cbWndExtra =sizeof( WORD ) ;
		wcchild.hInstance = hInstance;
		wcchild.hIcon = LoadIcon(NULL,(LPCSTR)IDI_DHICON);
		wcchild.hCursor = LoadCursor(NULL, IDC_ARROW);
		wcchild.hbrBackground = GetStockObject(0);
		wcchild.lpszMenuName =NULL;
		wcchild.lpszClassName = "ChildWindow";                 
		
		if(RegisterClass(&wcMess) == 0||RegisterClass(&wndclass) == 0||RegisterClass(&wcchild)==0)
			return FALSE;
	}
	hFrameInstance = hInstance;
	hFrameWnd = hWnd = CreateWindow(szAppName,"GPS OEM板测试软件--北京大恒",
			WS_OVERLAPPEDWINDOW,
			0,
			0,
			GetSystemMetrics(SM_CXSCREEN),
			GetSystemMetrics(SM_CYSCREEN),
			NULL,NULL,hInstance,NULL
			);
	if (!hWnd) return (FALSE);
	if(InitCom("COM1","COM1:4800,N,8,1")!=0)
		InitCom("COM2","COM2:4800,N,8,1");
	
	ShowWindow(hWnd,SW_SHOWMAXIMIZED);
	UpdateWindow(hWnd);
	
	while(TRUE){
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
		    
				if(msg.message == WM_QUIT )
						break;
				else{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
		     }
		}else	RecieveData();
			
	 }//while
	 return 0;

}   

long FAR PASCAL _export WndProc(HWND hWnd,UINT message,UINT wParam,LONG lParam)
{
	
	static char str[64];
	HDC hDC;                         
	PAINTSTRUCT ps;                  
    char Temp[32],szLonDeg[32],szLonMin[32],szLatDeg[32],szLatMin[32];                                         
	char szLatAve[48],szLonAve[48],szHeightAve[48],szstr1[32];
	char sss[] = "没有定位!";
	static char ss1[] = "开始定位";                                     
	static HBRUSH hBrush[12],hBrushA,hBrushB;
	static LOGPEN lpBlack = {PS_SOLID,1,1,RGB(0,0,0)};
	static LOGPEN lpGray = {PS_SOLID,1,1,RGB(128,128,128)};
	HPEN hBlackPen,hGrayPen;
	static RECT rect;
	int i,j,iScreenX,iScreenY;
	FARPROC lpDlg;
	time_t t;
    static int iSecond;
    char szOCMD[64];
	
	switch(message)
	{
		case WM_CREATE:
			iScreenX = GetSystemMetrics(SM_CXSCREEN);
			iScreenY = GetSystemMetrics(SM_CYSCREEN);
			GetClientRect(hWnd,&rect);				        	
			rect.left = 250;
			rect.top = 10;
			rect.right =500 ;
			rect.bottom = 220;
			MessageNum=0;
			hMessWnd = CreateWindow(
				"MessageW",
				"数据信息",
				WS_OVERLAPPEDWINDOW,
				0,
				310,
				GetSystemMetrics(SM_CXSCREEN),
				GetSystemMetrics(SM_CYSCREEN)-310,
				hWnd,
				NULL,
				hFrameInstance,
				NULL
			);
			ShowWindow(hMessWnd,SW_SHOW);
			return 0;	
		case WM_TIMER:
			switch(wParam){
				case 1:
					if(iTime)
					{
						iSecond++;					
						if((unsigned long)iSecond >= iTime)
						{	
							iTime = 0;
							iSecond = 0;
							bCount = FALSE;
	        				if(recfp)
							{
								time(&t);       // get current time
								fprintf(recfp,"\n#end");
								fprintf(recfp,"\n结束时间:%s",ctime(&t));
								fprintf(recfp,"\n The average of Latitude is :%d Degree  %6.4f Minute",iLatDegAve,dLatMinAve);
								fprintf(recfp,"\n The average of Longitude is :%d Degree  %6.4f Minute",iLonDegAve,dLonMinAve);
								fprintf(recfp,"\n The average of Altitude is :%7.1f Meters",fHeightAve);
								fclose(recfp);
								bSaveFile = FALSE;
								KillTimer(hWnd,idTimer);
							}
                            	MessageBox(hWnd,"计算结束!","消息",MB_OK);
                            bGetAver = FALSE;
						}
					}else{
						KillTimer(hWnd,idTimer);					
						bGetAver = FALSE;					        				
        				if(recfp)
						{
							time(&t);       // get current time
							fprintf(recfp,"\n#end");
							fprintf(recfp,"\n结束时间:%s",ctime(&t));
							fclose(recfp);
						}
				    }
				break;
			}			
			break;         
		case WM_PAINT:
			hDC = BeginPaint (hWnd, &ps);                          
			hBlackPen = CreatePenIndirect(&lpBlack);
	    	sprintf(Temp,"%s","卫星信噪比:(db)");
			TextOut(hDC,250,10,Temp,strlen(Temp));//560,290
			////////画图--根据卫星的个数来确定图的个数//////////////////			
			for(j = 0;j<iSateNo;j++)
			{
				if(Satellites[j].SNR >=38)
					hBrush[j] = CreateSolidBrush(RGB(66,171,44 ));		
				else	
					hBrush[j] = CreateSolidBrush(RGB(255,255,0 ));		
				SelectObject(hDC,hBlackPen);				
				SelectObject(hDC,hBrush[j]);				
				Rectangle(hDC,250+j*20,200-2*Satellites[j].SNR ,260+j*20,200);
				sprintf(str,"%2d",Satellites[j].SNR);     
				TextOut(hDC,250+j*20,200-2*Satellites[j].SNR-18,str,strlen(str));
					//////////显示卫星星号/////////////////////////////////	
				sprintf(str,"%02d",Satellites[j].SV);     
				TextOut(hDC,250+j*20,200,str,strlen(str));

			} 
			////////画图例///////////////			
			SelectObject(hDC,hBlackPen);				
			hBrushA = CreateSolidBrush(RGB(255,255,0 ));
			SelectObject(hDC,hBrushA);				
			Rectangle(hDC,260,230,270,240);//570,530,580,540);

			SelectObject(hDC,hBlackPen);				
			hBrushB = CreateSolidBrush(RGB(66,171,44 ));
			SelectObject(hDC,hBrushB);				
			Rectangle(hDC,360,230,370,240);//670,530,680,540);
			sprintf(str,"有效值");     
			TextOut(hDC,375,225,str,strlen(str));//685,525
			sprintf(str,"无效值");     
			TextOut(hDC,275,225,str,strlen(str));// 585,525
			
		//////////////////////////////////////////	    	
	    	SetTextColor(hDC,RGB(146,46,113));
	    	sprintf(Temp,"%s","经纬度:");
			TextOut(hDC,10,10,Temp,strlen(Temp));//570
			sprintf(Temp,"%s","东经: ");
			TextOut(hDC,10,32,Temp,strlen(Temp));
			sprintf(Temp,"%s","北纬: ");
			TextOut(hDC,10,54,Temp,strlen(Temp));
			sprintf(Temp,"%s","时间:");
			TextOut(hDC,10,76,Temp,strlen(Temp));
			sprintf(Temp,"%s","卫星个数:");
			TextOut(hDC,10,98,Temp,strlen(Temp));
			sprintf(Temp,"%s","有效卫星:");
			TextOut(hDC,10,120,Temp,strlen(Temp));
			sprintf(Temp,"%s","状态:");
			TextOut(hDC,10,142,Temp,strlen(Temp));

			sprintf(szLonDeg,"%d",iLonDeg);
			TextOut(hDC,60,32,szLonDeg,strlen(szLonDeg));//620,32
			TextOut(hDC,85,32,"度",strlen("度"));//645,32
			sprintf(szLonMin,"%6.4f",dLonMin);
			TextOut(hDC,105,32,szLonMin,strlen(szLonMin));//665,32
			TextOut(hDC,160,32,"分",strlen("分"));//720,32

			sprintf(szLatDeg,"%d",iLatDeg);
			TextOut(hDC,60,54,szLatDeg,strlen(szLatDeg));//620,54
			TextOut(hDC,85,54,"度",strlen("度"));//645,54
			sprintf(szLatMin,"%6.4f",dLatMin);
			TextOut(hDC,105,54,szLatMin,strlen(szLatMin));//665,54
			TextOut(hDC,160,54,"分",strlen("分"));//720,32
			if(bGetAver && iStatus)
			{
				sprintf(szstr1,"%s","经纬度平均值:");    		
				TextOut(hDC,10,164,szstr1,strlen(szstr1));
				sprintf(szLatAve,"纬度: %d 度  %6.4f 分",iLatDegAve,dLatMinAve);
				TextOut(hDC,10,188,szLatAve,strlen(szLatAve));
				sprintf(szLonAve,"经度: %d 度  %6.4f 分",iLonDegAve,dLonMinAve);
				TextOut(hDC,10,210,szLonAve,strlen(szLonAve));
				sprintf(szHeightAve,"高度:%7.1f 米",fHeightAve);
				TextOut(hDC,10,232,szHeightAve,strlen(szHeightAve));
            }
			////////画边界框/////////////////////

			hGrayPen = CreatePenIndirect(&lpGray);
			SelectObject(hDC,hGrayPen);				
			MoveTo(hDC,220,0);	//553,0
	    	LineTo(hDC,220,270);//553,GetSystemMetrics(SM_CYSCREEN)
			MoveTo(hDC,222,0);	//551,0
	    	LineTo(hDC,222,270);//551GetSystemMetrics(SM_CYSCREEN)

			SelectObject(hDC,hGrayPen);				
			MoveTo(hDC,0,270);//552,270
	    	LineTo(hDC,GetSystemMetrics(SM_CXSCREEN),270);
			MoveTo(hDC,0,272);//552,272
	    	LineTo(hDC,GetSystemMetrics(SM_CXSCREEN),272);      

			EndPaint(hWnd,&ps);            
	    	DeleteObject(hGrayPen);    
			DeleteObject(hBlackPen);
			DeleteObject(hBrushA);
			DeleteObject(hBrushB);
			for(j = 0;j<iSateNo;j++)
				DeleteObject(hBrush[j]);
			break;
		case WM_USER:
			hDC=GetDC(hWnd);  

			SetTextColor(hDC,RGB(0,128,192));
			sprintf(szLonDeg,"%d",iLonDeg);
			TextOut(hDC,60,32,szLonDeg,strlen(szLonDeg));  //620,32
			TextOut(hDC,85,32,"度",strlen("度"));//645,32
			sprintf(szLonMin,"%6.4f",dLonMin);
			TextOut(hDC,105,32,szLonMin,strlen(szLonMin));//665,32
			TextOut(hDC,160,32,"分",strlen("分"));//720

			sprintf(szLatDeg,"%d",iLatDeg);
			TextOut(hDC,60,54,szLatDeg,strlen(szLatDeg));//620,54
			TextOut(hDC,85,54,"度",strlen("度"));//645,54
			sprintf(szLatMin,"%6.4f",dLatMin);
			TextOut(hDC,105,54,szLatMin,strlen(szLatMin));//665,54
			TextOut(hDC,160,54,"分",strlen("分"));//720,54
			sprintf(str,"%02ld :",tmptime/10000L+8);     
			TextOut(hDC,60,76,str,strlen(str)); //620,76
			tmptime%=10000L;
			sprintf(str,"%02ld :",tmptime/100L);       
			TextOut(hDC,90,76,str,strlen(str));//650,76
			tmptime%=100L;
			sprintf(str,"%02ld",tmptime);    
			TextOut(hDC,120,76,str,strlen(str));//680,76
						
			sprintf(str,"%02d 颗",iSateNo);     
			TextOut(hDC,85,98,str,strlen(str));//645,98
		//////////取有效卫星个数///////////////			
        	for(i = 0,validSate=0;i<iSateNo;i++)
        	{
        	 if(Satellites[i].SNR >= 38)
        	 	validSate++;
		    }                           

			sprintf(str,"%02d 颗",validSate);     
			TextOut(hDC,85,120,str,strlen(str));//645,120
		//////////显示卫星状态//////////////////////////////				
			if(iStatus == 0)
				TextOut(hDC,60,142,sss,strlen(sss));	//620,142
			else
				TextOut(hDC,60,142,ss1,strlen(ss1));	//620,142			
		//////////显示卫星星号/////////////////////////////////	
/*			for(j = 0;j<iSateNo;j++)
			{
					sprintf(str,"%02d",Satellites[j].SV);     
					//560+j*20,500
					TextOut(hDC,250+j*20,200,str,strlen(str));
			}*/
		///////////取画图区域坐标,刷新//////////////////////////////////////			
			if(bGetAver && iStatus)
			{
				sprintf(szLatAve,"纬度: %d 度  %6.4f 分",iLatDegAve,dLatMinAve);
				TextOut(hDC,10,188,szLatAve,strlen(szLatAve));
				sprintf(szLonAve,"经度: %d 度  %6.4f 分",iLonDegAve,dLonMinAve);
				TextOut(hDC,10,210,szLonAve,strlen(szLonAve));
				sprintf(szHeightAve,"高度:%7.1f 米",fHeightAve);
				TextOut(hDC,10,232,szHeightAve,strlen(szHeightAve));
				SetTextColor(hDC,RGB(146,46,113));
				sprintf(szstr1,"%s","经纬度平均值:");    		
				TextOut(hDC,10,164,szstr1,strlen(szstr1));
            }

			InvalidateRect(hWnd,&rect,TRUE);
			ReleaseDC(hWnd,hDC);                            
			break;
			case WM_COMMAND:
			switch (wParam) 
			{
        		int iCheckNum;
        		char szChkNum[5];
        		
        		case IDM_GGA:
			
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,GGA%02d",iInterval);
					//sprintf(str,"$PFEC,GPint,GGA01,GLL00,ZDA00,GSA00,GSV00,VTG00,RMC00,TST00");        			
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_GSV:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,GSV%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_ZDA:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,ZDA%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;            
        			break;
        		case IDM_RMC:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,RMC%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_VTG:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,VTG%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_TST:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,tst%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_GSA:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,GSA%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
        		case IDM_GLL:
        			if(!GetInterval()) break;
        			sprintf(str,"$PFEC,GPint,GLL%02d",iInterval);
        			iCheckNum = GetCheckNum(str);
        			sprintf(szChkNum,"%02x",iCheckNum);
        			sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
        			SendCommand(szOCMD);
        			memset(str,0,sizeof(str)) ;
        			memset(szOCMD,0,sizeof(szOCMD)) ;
        			break;
				case IDM_CLOSE:
					sprintf(str,"%s*%x\r\n",close,GetCheckNum(close));
					SendCommand(str);
					memset(str,0,sizeof(str)) ;
					break;
				case IDM_OPEN:
					sprintf(str,"%s*%2x\r\n",open,GetCheckNum(open));
					SendCommand(str);
					memset(str,0,sizeof(str)) ;
					break;
				case IDM_OUTPUT:
					GetOutputCommmand();  
					break;                 
				case IDM_SETUP:
				    SetupCommID();	
					break;
				case IDM_ABOUT:
					lpDlg=MakeProcInstance(AboutDlgProc,hFrameInstance);
					DialogBox(hFrameInstance,"ABOUT",hFrameWnd,lpDlg);
					FreeProcInstance(lpDlg);
					break;
				case IDM_SAMPLE:
					 CreateDialog(hFrameInstance,"SAMPLE",hWnd,
						MakeProcInstance((FARPROC)DialogWndProc,hFrameInstance));
					break;
				case IDM_MESSAGE:
					if(hMessWnd)    // message window already exist
						break;
					hMessWnd = CreateWindow(
						"MessageW",
						"数据信息",
						WS_OVERLAPPEDWINDOW,
						0,
						310,
						GetSystemMetrics(SM_CXSCREEN),
						GetSystemMetrics(SM_CYSCREEN)-310,
						hWnd,
						NULL,
						hFrameInstance,
						NULL
					);
					ShowWindow(hMessWnd,SW_SHOW);
					SetWindowPos(hMessWnd,hWnd,
								0,
								310,
								GetSystemMetrics(SM_CXSCREEN),
								GetSystemMetrics(SM_CYSCREEN)-310,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -