GPSDlg.cpp
上传用户:yyd112
上传日期:2009-12-24
资源大小:43k
文件大小:8k
源码类别:

GPS编程

开发平台:

Visual C++

  1. // GPSDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "GPS.h"
  5. #include "GPSDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. extern CGPSApp theApp;
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CGPSDlg dialog
  14. CGPSDlg::CGPSDlg(CWnd* pParent /*=NULL*/)
  15. : CDialog(CGPSDlg::IDD, pParent)
  16. {
  17. //{{AFX_DATA_INIT(CGPSDlg)
  18. // NOTE: the ClassWizard will add member initialization here
  19. //}}AFX_DATA_INIT
  20. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  21. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  22. }
  23. void CGPSDlg::DoDataExchange(CDataExchange* pDX)
  24. {
  25. CDialog::DoDataExchange(pDX);
  26. //{{AFX_DATA_MAP(CGPSDlg)
  27. DDX_Control(pDX, IDC_COMBCMD, m_CombCmd);
  28. //}}AFX_DATA_MAP
  29. }
  30. BEGIN_MESSAGE_MAP(CGPSDlg, CDialog)
  31. //{{AFX_MSG_MAP(CGPSDlg)
  32. ON_WM_PAINT()
  33. ON_WM_QUERYDRAGICON()
  34. ON_BN_CLICKED(IDC_CMD, OnCmd)
  35. ON_BN_CLICKED(IDC_BIN, OnBin)
  36. ON_MESSAGE(WM_USER,OnMyMessage)
  37. ON_BN_CLICKED(IDC_NMEA, OnNmea)
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CGPSDlg message handlers
  42. int OpenComm(); 
  43. UINT ComReceiveTheadProc(LPVOID pParam);
  44. BOOL CGPSDlg::OnInitDialog()
  45. {
  46. CDialog::OnInitDialog();
  47. // Set the icon for this dialog.  The framework does this automatically
  48. //  when the application's main window is not a dialog
  49. SetIcon(m_hIcon, TRUE); // Set big icon
  50. SetIcon(m_hIcon, FALSE); // Set small icon
  51. // TODO: Add extra initialization here
  52.  OpenComm();
  53.    AfxBeginThread(ComReceiveTheadProc, NULL,THREAD_PRIORITY_LOWEST);
  54. return TRUE;  // return TRUE  unless you set the focus to a control
  55. }
  56. // If you add a minimize button to your dialog, you will need the code below
  57. //  to draw the icon.  For MFC applications using the document/view model,
  58. //  this is automatically done for you by the framework.
  59. void CGPSDlg::OnPaint() 
  60. {
  61. if (IsIconic())
  62. {
  63. CPaintDC dc(this); // device context for painting
  64. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  65. // Center icon in client rectangle
  66. int cxIcon = GetSystemMetrics(SM_CXICON);
  67. int cyIcon = GetSystemMetrics(SM_CYICON);
  68. CRect rect;
  69. GetClientRect(&rect);
  70. int x = (rect.Width() - cxIcon + 1) / 2;
  71. int y = (rect.Height() - cyIcon + 1) / 2;
  72. // Draw the icon
  73. dc.DrawIcon(x, y, m_hIcon);
  74. }
  75. else
  76. {
  77. CDialog::OnPaint();
  78. }
  79. }
  80. // The system calls this to obtain the cursor to display while the user drags
  81. //  the minimized window.
  82. HCURSOR CGPSDlg::OnQueryDragIcon()
  83. {
  84. return (HCURSOR) m_hIcon;
  85. }
  86. char gBuf[100];
  87. LRESULT CGPSDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
  88. {
  89. SetDlgItemText(IDC_GPSINFO,gBuf);
  90. int i,k;
  91. char buf[100],str[20],sumhex[3];
  92. char UTC[20],STA[3],Latitude[40],Longitude[40];
  93. unsigned char sum;
  94. CString str1;
  95. strcpy(buf,gBuf);
  96. sum=0;
  97. for(i=1;i<100;i++) {if(buf[i]=='*') break; sum^=buf[i];}
  98. sumhex[0]=(sum/16)>9 ? (sum/16)-10+0x41:sum/16+0x30;
  99. sumhex[1]=(sum&15)>9 ? (sum&15)-10+0x41:(sum&15)+0x30;
  100. sumhex[2]=0;
  101. str1.Format("%2X",sum);
  102. SetDlgItemText(IDC_SUM,sumhex);
  103. for(i=0;i<6;i++) str[i]=buf[i];
  104. str[6]=0;
  105. if((strcmp(str,"$GPRMC"))==0)
  106. {
  107. k=0;
  108. for(i=0;i<10;i++){if(buf[k++] == ',') break;}
  109. for(i=0;i<10;i++){ UTC[i]=buf[k]; if(buf[k++] == ',') break;}
  110. UTC[i]=0;
  111. STA[0]=buf[k];
  112. STA[1]=0;
  113. // for(i=0;i<10;i++){if(buf[k++] == ',') break;} k++;
  114. for(i=0;i<10;i++){if(buf[k++] == ',') break;}
  115. for(i=0;i<20;i++){ Latitude[i]=buf[k]; if(buf[k++] == ',') break;}
  116. Latitude[i]=0;
  117. for(i=0;i<10;i++){if(buf[k++] == ',') break;}
  118. for(i=0;i<20;i++){ Longitude[i]=buf[k]; if(buf[k++] == ',') break;}
  119. Longitude[i]=0;
  120. SetDlgItemText(IDC_UTC,UTC);
  121. SetDlgItemText(IDC_STA,STA);
  122. SetDlgItemText(IDC_LATITUDE,Latitude);
  123. SetDlgItemText(IDC_LONGITUDE,Longitude);
  124. }
  125. return 0;
  126. }
  127. HANDLE hCom;
  128. DCB Dcb;
  129. void CGPSDlg::OnCmd() 
  130. {
  131. DWORD Num;
  132. char buf[50];
  133. char cmd0[]="$PRWIILOG,???,V,,,rn";
  134. char cmd[][40]={"$PRWIILOG,RMC,A,T,1,0rn",
  135. "$PRWIILOG,GGA,A,T,2,0rn",
  136. "$PRWIILOG,GSV,A,T,2,0rn",
  137. "$PRWIILOG,GSA,A,T,2,0rn",
  138. "$PRWIILOG,ZCH,A,T,1,0rn",
  139. "$PRWIINIT,A, , , , , , , , , , , , ,rn",
  140. "$PRWIINIT,A, , , , , , , , , , , , ,rn"};
  141. char cr[]="rn";
  142.     strcpy(buf,cmd0);
  143. WriteFile(hCom,buf,strlen(buf),&Num,NULL);
  144.     strcpy(buf,cmd[m_CombCmd.GetCurSel()]);
  145. //    strcpy(buf,"$PRWIILOG,GGA,A,T,1,0");
  146. WriteFile(hCom,buf,strlen(buf),&Num,NULL);
  147. if(m_CombCmd.GetCurSel()==6)
  148. {
  149. int i;
  150. for(i=0;i<5;i++)
  151. {
  152. strcpy(buf,cmd[i]);
  153. WriteFile(hCom,buf,strlen(buf),&Num,NULL);
  154. }
  155. }
  156. }
  157. UINT ComReceiveTheadProc(LPVOID pParam)
  158. {
  159. unsigned char buf[100],buf1[2];
  160. UINT Msg=WM_USER;
  161. WPARAM wParam=NULL;
  162. LPARAM lParam=0;
  163. int i,num;
  164. bool rev$,LF;
  165. CString strm;
  166. DWORD Num1; 
  167. HWND hWnd=theApp.m_pMainWnd->m_hWnd;
  168. while(1)
  169. {
  170. num=0;
  171.     rev$=false;
  172. LF=false;
  173. while(!rev$)
  174. {
  175. Sleep(10);
  176.     ReadFile(hCom,buf1,1,&Num1,NULL);
  177. if(Num1==1 && buf1[0]=='$')rev$=true;  
  178. };
  179. buf[num++]=buf1[0];  
  180. while(!LF && num<80 )
  181. {
  182.     ReadFile(hCom,buf1,1,&Num1,NULL);
  183. if(Num1==1)
  184. {
  185. buf[num++]=buf1[0];  
  186. if(buf1[0]==0x0A) LF=true;
  187. }
  188. };
  189. if(LF)
  190. {
  191. for(i=0;i<num;i++) gBuf[i]=buf[i];
  192. // pView->PostMessage(Msg,wParam, lParam );
  193. PostMessage(hWnd,Msg,wParam, lParam );
  194. }
  195. }
  196. // HWND hWnd=(HWND)theApp.GetMainWnd();
  197. return 1;
  198. }
  199. int OpenComm() 
  200. {
  201. hCom=CreateFile(
  202. "COM1",
  203. GENERIC_READ | GENERIC_WRITE,
  204. 0,
  205. NULL,
  206. OPEN_EXISTING,
  207. 0,
  208. NULL);
  209. if(hCom==INVALID_HANDLE_VALUE)
  210. {   
  211. char szMsg[40]="Can not open ";
  212. MessageBox(NULL,"COM1",szMsg,MB_OK );
  213. return 0;
  214. }
  215. GetCommState(hCom,&Dcb);
  216. Dcb.BaudRate=CBR_9600;
  217. Dcb.BaudRate=CBR_4800;
  218. Dcb.ByteSize=8;
  219. Dcb.Parity=NOPARITY;
  220. Dcb.StopBits=ONESTOPBIT;
  221. Dcb.fOutxCtsFlow=FALSE;
  222. Dcb.fOutxDsrFlow=FALSE; 
  223. Dcb.fDtrControl=DTR_CONTROL_ENABLE;
  224. // Dcb.fDtrControl=DTR_CONTROL_DISABLE;
  225. Dcb.fDsrSensitivity=FALSE; 
  226. Dcb.fRtsControl=RTS_CONTROL_ENABLE;
  227. Dcb.fNull=FALSE;
  228. SetCommState(hCom,&Dcb);
  229. COMMTIMEOUTS Timeouts;
  230. GetCommTimeouts(hCom,&Timeouts);
  231. Timeouts.ReadIntervalTimeout =100;
  232. // Timeouts.ReadTotalTimeoutMultiplier=2;
  233. Timeouts.ReadTotalTimeoutMultiplier=20;
  234. Timeouts.ReadTotalTimeoutConstant=20;
  235. Timeouts.WriteTotalTimeoutMultiplier=20;
  236. Timeouts.WriteTotalTimeoutConstant =200;
  237. SetCommTimeouts(hCom,&Timeouts);
  238. return 1;
  239. }
  240. void CGPSDlg::OnBin() 
  241. {
  242. DWORD Num;
  243. int i;
  244. char buf[50];
  245. char cr[]="rn";
  246.     strcpy(buf,"$PRWIIPRO,,RBIN");
  247. strcat(buf,cr);
  248. WriteFile(hCom,buf,strlen(buf),&Num,NULL);
  249. }
  250. void CGPSDlg::OnNmea() 
  251. {
  252. DWORD Num;
  253. int i;
  254. char buf[18],cmd[18];
  255. char cr[]="rn";
  256. union {
  257. unsigned short Word[5];
  258. unsigned char  byte[10];
  259. }Head;
  260. union{
  261. unsigned short Word[4];
  262. unsigned char  byte[8];
  263. }Data;
  264. char cmdx[]={0xFF,0x81, 0x33,5, 3,0, 0,7, 0xCB,0x71, 0,0, 0,0, 1,0, 0xFF,0xFF};
  265. unsigned short x,x1;
  266. x=0xFF81^0x533^3^0x700;
  267. x1=0x81FF+0x533+3+0x700;
  268. x=-x1;
  269. unsigned short w[4],sum;
  270. w[0]=0xFF81;
  271. w[1]=0x533;
  272. w[2]=3;
  273. w[3]=0x700;
  274. sum=0;
  275. for(i=0;i<4;i++) sum+=w[i];
  276. Head.Word[0]=0x81FF;
  277. Head.Word[1]=0x533;//1331;   /* ID proctocal=1331=0x533 */
  278. Head.Word[2]=3;  /* count for the data */
  279. Head.Word[3]=0x700;
  280. Head.Word[4]=Head.Word[0]+Head.Word[1]+Head.Word[2]+Head.Word[3];
  281. if(Head.Word[4] != 32768) Head.Word[4]=-Head.Word[4];
  282. Data.Word[0]=0; 
  283. Data.Word[1]=0; 
  284. Data.Word[2]=1; 
  285. Data.Word[3]=Data.Word[0]+Data.Word[1]+Data.Word[2]; 
  286. Data.Word[3]=-Data.Word[3];
  287. for(i=0;i<10;i++) buf[i]=Head.byte[i];
  288. for(i=0;i<8;i++)  buf[10+i]=Data.byte[i];
  289. for(i=0;i<9;i++)
  290. {
  291. cmd[2*i]=buf[2*i+1];
  292. cmd[2*i+1]=buf[2*i];
  293. }
  294. WriteFile(hCom,cmdx,18,&Num,NULL);
  295. }