| m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); file://以異步方式打開(kāi)COM1口 SetCommMask (m_hCom, EV_RXCHAR ) ; file://添加或修改Windows所報告的事件列表 SetupComm (m_hCom,READBUFLEN/*讀緩沖*/,WRITEBUFLEN/*寫(xiě)緩沖*/); // 初始化通訊設備參數 // 清除緩沖信息 PurgeComm (m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ; // 對異步I/O進(jìn)行設置 CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; file://接收兩連續字節的最大時(shí)間間隔 CommTimeOuts.ReadTotalTimeoutMultiplier =0; file://接收每字節的平均允許時(shí)間 CommTimeOuts.ReadTotalTimeoutConstant = 0 ; file://接收時(shí)間常數 SetCommTimeouts (m_hCom , &CommTimeOuts) ; file://獲取并設置串口 GetCommState ( m_hCom, &dcb) ; dcb.BaudRate = CBR_4800; dcb.ByteSize = 8; dcb.Parity = ODDPARITY; dcb.StopBits = ONESTOPBIT ; SetCommState( m_hCom, &dcb); |
| while(true){ WaitCommEvent (m_hCom,&dwEvtMask,NULL); if (dwEvtMask&EV_RXCHAR == EV_RXCHAR) if(ComStat.cbInQue>0) ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead); } |
| for(int i=0;i if(Data[i]==‘$‘) file://幀頭,SectionID為逗號計數器 SectionID=0; if(Data[i]==10){ file://幀尾 } if(Data[i]==‘,‘) file://逗號計數 SectionID++; else { switch(SectionID){ case 1: file://提取出時(shí)間 m_sTime+=Data[i]; break; case 2: file://判斷數據是否可信(當GPS天線(xiàn)能接收到有3顆GPS衛星時(shí)為A,可信) if(Data[i]==‘A‘) GPSParam[m_nNumber].m_bValid=true; break; case 3: file://提取出緯度 m_sPositionY+=Data[i]; break; case 5: file://提取出經(jīng)度 m_sPositionX+=Data[i]; break; case 9: file://提取出日期 m_sDate+=Data[i]; break; default: break; } } } |
| ::strcpy(buf,m_sTime); str.Format("%c%c",buf[0],buf[1]); GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24; file://提取出小時(shí)并轉化為24小時(shí)制北京時(shí)間 file://buf第2、3字節為分鐘,4、5字節為秒,提取方法同上 …… ::strcpy(buf,m_sDate); str.Format("%c%c",buf[0],buf[1]); file://提取出月份 file://buf第2、3字節為天,4、5字節為年,提取方法同上 …… ::strcpy(buf,m_sPositionY); str.Format("%c%c",buf[0],buf[1]); PositionValue=atoi(str); str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]); GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str); file://提取出緯度 …… ::strcpy(buf,m_sPositionX); if(m_sPositionX.GetLength()==10) file://經(jīng)度超過(guò)90度(如東經(jīng)125度) { str.Format("%c%c%c",buf[0],buf[1],buf[2]); PositionValue=atoi(str); str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]); GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str); file://提取出經(jīng)度(單位為分) } if(m_sPositionX.GetLength()==9) file://經(jīng)度未超過(guò)90度(如東經(jīng)89度) { file://處理方法同上,只是buf的第0、1字節為度數,2~9為分數。 } |
聯(lián)系客服