读书人

用Winsocket接收到的经过BCD编码的16进

发布时间: 2012-02-24 16:30:39 作者: rapoo

用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








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
[解决办法]
楼上你得说具体协议,比如从哪一字节开始是时间

读书人网 >VB

热点推荐