用Winsocket接收到的经过BCD编码的16进制标识的GPS数据流。我如何从中提取gps数据的速度,经纬度??

解决方案 »

  1.   

    首先要了解BCD编码,会编码和解码 BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。 如果你收到的是BCD编码后的数据流,就解码,然后取数据
      

  2.   

    不需要瞭解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
    #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
      

  3.   

    时、分、秒的表示方法:
    表示范围:小时,00——23;分钟,00——59;秒,00——59
    时、分、秒均采用压缩BCD编码。
    [例如]: 10点23分15秒表示为:
    10H,23H,15H
    纬度表示方法: 纬度表示范围:00度00.000分—8959.999分;
    采用压缩BCD编码,但最高位是符号位。“正”表示“北纬”,“负”表示“南纬”;TCP数据流,不是用串口接收的那种。比如收到的一跳完整的数据包:
    24 24 4B 00 1A DF AF 43 AE 03 20 16 33 53 02 93 52 19 10 63 35 58 00 52 03 29 C7 10 64 96 0A 
    谢谢上面的回答,希望有源码最好,当然如果有VB源码更好,因为本项目是VB做的。 重谢!
      

  4.   

    搞清楚了,谢谢 itcoco 椰子 人等 的关注。谁要是有这方面的问题,我也可以告诉大家了,呵呵
      

  5.   

    我还是看不懂啊,就像24 24 4B 00 1A DF AF 43 AE 03 20 16 33 53 02 93 52 19 10 63 35 58 00 52 03 29 C7 10 64 96 0A  怎么分析啊,谢谢了