用脚本语言squirrel解析GPS语句

GPGGA是GPS数据输出格式语句,意思是一帧GPS定位的主要数据,是NMEA格式中使用最广的数据之一。该语句包括17个字段。

释义

$GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,HDOP-水平精度因子,海拔高,高度单位,大地水准面高度异常差值,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符和换行符),分别用14个逗号进行分隔。

格式示例:$GPGGA,014434.70,3817.13334637,N,12139.72994196,E,4,07,1.5,6.571,M,8.942,M,0.7,0016*79

该数据帧的结构及各字段释义如下:

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx

$GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);

<1> UTC时间,格式为hhmmss.sss;

<2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);

<3> 纬度半球,N或S(北纬或南纬)

<4> 经度,格式为dddmm.mmmm(第一位零也将传送);

<5> 经度半球,E或W(东经或西经)

<6> GPS状态, 0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分

<7> 使用卫星数量,从00到12(第一个零也将传送)

<8> HDOP-水平精度因子,0.5到99.9,一般认为HDOP越小,质量越好。

<9> 海拔高度,-9999.9到9999.9米

M 指单位米

<10> 大地水准面高度异常差值,-9999.9到9999.9米

M 指单位米

<11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空

<12> 差分参考基站标号,从0000到1023(首位0也将传送)。

* 语句结束标志符

xx 从$开始到*之间的所有ASCII码的异或校验

回车符,结束标记

换行符,结束标记

local sData = "$GPGGA,064717.30,3027.75842525,N,11427.16236818,E,1,19,1.0,35.0745,M,-13.5103,M,,*75"; //gps语句
local strarr = []; //定义一个数组
strarr.resize(300); //分配大小
local strarrlen = 0; //数组元素个数


//从命令串中获取校验值 整数
function ComputeChecksum(sData)
{
    local checksum = 0;
    local nLength = sData.len();
    // 跳过 $ ,接收字符串命令到*
    local i = 1;

    while(i < nLength &&
            sData[i] != ('*') &&
            sData[i] != ('\r') &&
            sData[i] != ('\n'))
    {
        checksum = checksum ^  sData[i];
        i++;
    }
    return checksum;
}


//异或校验是否正确,正确返回true
function CheckSumOk(sData)
{
    //计算校验码
    local CalculatedCheckSum = ComputeChecksum(sData);
    //最后两位
    local str = sData.slice(sData.len() - 2, sData.len());
    //转为整数
    local ReceivedCheckSum = str.tointeger(16);
    //比较整数
    return (CalculatedCheckSum == ReceivedCheckSum);
}


//拆分字符串
strarr = split(sData, ",");
strarrlen = strarr.len();
for(local i = 0; i < strarrlen; i++)
{
    local str = format("%s %d index=%d value=%s\n", __FILE__, __LINE__, i, strarr[i]);
    print(str);


    //  print("index=" + i + " value=" + strarr[i] + "\n")
}


//判断校验码是否一致
local checkvalue = CheckSumOk(sData);
if(checkvalue)
    print("checkvalue=1\n");
else
    print("checkvalue=0\n");




输出:

---------- squirrel ----------
D:\squirrel3\bin\string.nut 46 index=0 value=$GPGGA
D:\squirrel3\bin\string.nut 46 index=1 value=064717.30
D:\squirrel3\bin\string.nut 46 index=2 value=3027.75842525
D:\squirrel3\bin\string.nut 46 index=3 value=N
D:\squirrel3\bin\string.nut 46 index=4 value=11427.16236818
D:\squirrel3\bin\string.nut 46 index=5 value=E
D:\squirrel3\bin\string.nut 46 index=6 value=1
D:\squirrel3\bin\string.nut 46 index=7 value=19
D:\squirrel3\bin\string.nut 46 index=8 value=1.0
D:\squirrel3\bin\string.nut 46 index=9 value=35.0745
D:\squirrel3\bin\string.nut 46 index=10 value=M
D:\squirrel3\bin\string.nut 46 index=11 value=-13.5103
D:\squirrel3\bin\string.nut 46 index=12 value=M
D:\squirrel3\bin\string.nut 46 index=13 value=
D:\squirrel3\bin\string.nut 46 index=14 value=*75
checkvalue=1

你可能感兴趣的:(服务器,c++,c语言,开发语言,visual,studio,windows)