用Winsocket接收到的经过BCD编码的16进制标识的GPS数据流。小弟我怎么从中提取gps数据的速度,经纬度?
用Winsocket接收到的经过BCD编码的16进制标识的GPS数据流。我如何从中提取gps数据的速度,经纬度??
用Winsocket接收到的经过BCD编码的16进制标识的GPS数据流。我如何从中提取gps数据的速度,经纬度??
------解决方案--------------------
这类问题,要是没有说明书,真的不好回答啊。
------解决方案--------------------
首先要了解BCD编码,会编码和解码 BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。
如果你收到的是BCD编码后的数据流,就解码,然后取数据
------解决方案--------------------
不需要瞭解NMEA 0183通訊協定的全部資訊,僅需要從中挑選出我們需要的那部分定位資料。其餘的資訊我們忽略掉。
如果此時和衛星的通訊正常的話,可以接收到的資料格式樣如下:
$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
資料說明如下:
$GPRMC:代表GPS推薦的最短數據
204700: UTC_TIME 24小時制的標準時間,按照小時/分鐘/秒的格式
A: A 或者 V A表示資料"OK",V表示一個警告
3403.868: LAT 緯度值,精確到小數點前4位,後3位
N LAT_DIR N表示北緯,S表示南緯
11709.432: LON 經度值,精確到小數點前5位,後3位
W LON_DIR W表示西經,E表示東經
如果當前沒有和衛星取得聯繫,那麼字串的格式為:
$GPRMC,UTC_TIME,V,...
下面是一個例子:
$GPRMC,204149,V,,,,,,,170698,,*3A
2004-12-25
用Winsocket接收到的经过BCD编码的16进制标识的GPS数据流。我如何从中提取gps数据的速度,经纬度??
------解决方案--------------------
这类问题,要是没有说明书,真的不好回答啊。
------解决方案--------------------
首先要了解BCD编码,会编码和解码 BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。
如果你收到的是BCD编码后的数据流,就解码,然后取数据
------解决方案--------------------
不需要瞭解NMEA 0183通訊協定的全部資訊,僅需要從中挑選出我們需要的那部分定位資料。其餘的資訊我們忽略掉。
如果此時和衛星的通訊正常的話,可以接收到的資料格式樣如下:
$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
資料說明如下:
$GPRMC:代表GPS推薦的最短數據
204700: UTC_TIME 24小時制的標準時間,按照小時/分鐘/秒的格式
A: A 或者 V A表示資料"OK",V表示一個警告
3403.868: LAT 緯度值,精確到小數點前4位,後3位
N LAT_DIR N表示北緯,S表示南緯
11709.432: LON 經度值,精確到小數點前5位,後3位
W LON_DIR W表示西經,E表示東經
如果當前沒有和衛星取得聯繫,那麼字串的格式為:
$GPRMC,UTC_TIME,V,...
下面是一個例子:
$GPRMC,204149,V,,,,,,,170698,,*3A
2004-12-25
- C/C++ code
#ifndef __GPS_H__ #define __GPS_H__ typedef struct tagGPRMC { char time[20]; char statu[5]; char latitude[20]; char southornorth[5]; char longitude[20]; char eastorwest[5]; char high[10]; char director[10]; char date[20]; char magic[10]; char magicdirtor[5]; }GPRMCHead, * LP_GPRMC_Head; typedef struct tagGPGSA { char mode[5]; char currentState[5]; char PRN01[5]; char PRN02[5]; char PRN03[5]; char PRN04[5]; char PRN05[5]; char PRN06[5]; char PRN07[5]; char PRN08[5]; char PRN09[5]; char PRN10[5]; char PRN11[5]; char PRN12[5]; char pdop[10]; char vdop[10]; char hdop[10]; char endvalue[50]; }GPGSAHead, *LP_GPGSA_Head; typedef struct tagGPGSV { char totalnum[5]; char currentnum[5]; char totalstar[5]; char PRV01[5]; char elevation01[10]; char depression01[10]; char noise01[10]; char PRV02[5]; char elevation02[10]; char depression02[10]; char noise02[10]; char PRV03[5]; char elevation03[10]; char depression03[10]; char noise03[10]; char PRV04[5]; char elevation04[10]; char depression04[10]; char noise04[10]; char endvalue[10]; }GPGSVHead, *LP_GPGSV_Head; void showMessage(char message[]); void getGPSPort(char backstr[]); void setCOMPortPrj(void); void getNextChar(int length, char backstr[]); void getString(char strChar[]); void checkNULL(); void getStringEnd(char stopcn, char backstr[]); void getBetweenChar(char input[], char backstr[], char stopcn); void getSystemTime(char stime[], char sdate[]); void gpsALM(); void gpsPGRMI(); void gpsGPALM(); void gpsPGRMO(); void gpsGPLM(); void gpsGPGGA(); void gpsGPGSA(); void gpsGPGSV(); void gpsGPRMC(); void gpsGPVTG(); void gpsLCGLL(); void gpsLCVTG(); void gpsPGRME(); void gpsPGRMT(); void showPass(); int sendComData(char message[]); int getComData(char message[]); #endif
------解决方案--------------------
楼上你得说具体协议,比如从哪一字节开始是时间