c++ 用于将GPS坐标转换为NMEA格式的AVR代码

yxyvkwin  于 2023-03-25  发布在  其他
关注(0)|答案(3)|浏览(169)

我做了一个Android应用程序,从GPS获取数据并发送。它由aPC拾取,并通过USB发送到AVR套件,它需要将经度,纬度格式转换为NMEA格式并将其返回到USB。消息格式为:
纬度='23.353434333'和经度='45.34333345'
我需要使用ATmega32将上述消息转换为NMEA GPS格式,但由于我不知道AVR编程,有人可以建议我如何做或上面的代码?

nkoocmlb

nkoocmlb1#

你没有AVR编程的经验与实现NMEA无关。)
您给出的表示 latitude ='23.353434333' and longitude ='45.34333345' 称为decimal degrees(您的示例缺少N/S和E/W指示)。
我假设您知道NMEA是一个协议规范,而不仅仅是一个坐标格式。NMEA标准在数据集中使用以下坐标表示法:
XXYY.ZZZZ
这可以直接用度分秒格式表示,如下所示:
XX° YY'(0.ZZZZ * 60)”
因此,两者之间的转换是微不足道的,从度分秒十进制度的转换也是如此:
十进制度=度+分/60 +秒/3600
因此,从本质上讲,你只需要执行给定的转换反向,你得到你的NMEA坐标格式。
NMEA数据集看起来像这样:
$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A *13
我用粗体突出显示了坐标信息。实现转换并没有什么特别的,而实现NMEA协议需要额外阅读一些关于实现细节的内容。

rn0zuynd

rn0zuynd2#

void Convert_NMEA_Decimal(void)
{
    char CDD[3] = {};
    char CSS[7] = {};
    float DD = 0.0;
    float SS = 0.0;
    float LatDec = 0.0;
    float LogDec = 0.0;
    //convert Latitude from NMEA DDSS.SSSS to decimal
    CDD[0] = gnss1.latitude[0]; CDD[1] = gnss1.latitude[1]; //Separete DD from DDSS.SSSS
    CSS[0] = gnss1.latitude[2]; CSS[1] = gnss1.latitude[3]; CSS[2] = gnss1.latitude[4]; //Separete SS.SSSS from DDSS.SSSS
    CSS[3] = gnss1.latitude[5]; CSS[4] = gnss1.latitude[6];
    CSS[5] = gnss1.latitude[7]; CSS[6] = gnss1.latitude[8];

    DD = strtod(CDD,NULL); //Convert CDD string to float (DD)
    SS = strtod(CSS,NULL); //Convert CSS string to float (SS)

    LatDec = (DD + (SS/60)); //Convert for NMEA to Decimal
//  if(gnss1.latitude[9] == 'N')
//  {
//      LatDec = LatDec * -1;
//  }

    //convert Longitude from NMEA DDDSS.SSSS to decimal
    CDD[0] = gnss1.longitude[0]; CDD[1] = gnss1.longitude[1]; CDD[2] = gnss1.longitude[2]; //Separete DDD from DDSS.SSSS
    CSS[0] = gnss1.longitude[3]; CSS[1] = gnss1.longitude[4]; CSS[2] = gnss1.longitude[5]; //Separete SS.SSSS from DDSS.SSSS
    CSS[3] = gnss1.longitude[6]; CSS[4] = gnss1.longitude[7];
    CSS[5] = gnss1.longitude[8]; CSS[6] = gnss1.longitude[9];

    DD = strtod(CDD,NULL); //Convert CDD string to float (DD)
    SS = strtod(CSS,NULL); //Convert CSS string to float (SS)

    LogDec = (DD + (SS/60)); //Convert for NMEA to Decimal
    if(gnss1.longitude[10] == 'S' || gnss1.longitude[10] == 'W') //if longitude S or W Latitude x -1
    {
        LogDec = LogDec * -1;
    }

    snprintf(gnss1.latitude, 10, "%f", LatDec); //Convert Float Latitude to String
    snprintf(gnss1.longitude, 11, "%f", LogDec);//Convert Float Longitude to String
}
ktecyv1j

ktecyv1j3#

将NMEA十进制-十进制度值转换为度/分/秒首先,将十进制-十进制值转换为十进制:5144.3855(ddmm.mmmm)= 51 44.3855 = 51 + 44.3855/60 = 51.7397583度
然后将十进制转换为度、分、秒:51度+ .7397583 * 60 = 44.385498 = 44分钟.385498 = 23.1秒结果:51 44' 23.1”

相关问题