AVR代码,用于将GPS坐标转换为NMEA格式

AVR code for converting GPS coordinates to NMEA format

本文关键字:转换 NMEA 格式 坐标 GPS 代码 用于 AVR      更新时间:2023-10-16

我制作了一个Android应用程序,可以从GPS中获取数据并发送。它由PC拾取,并通过USB发送到AVR套件,该套件需要将经度、纬度格式转换为NMEA格式,然后返回到USB。消息格式为:

纬度='23.353434333',经度='45.34333345'

我需要使用ATmega32将上述消息转换为NMEA GPS格式,但由于我不知道AVR编程,有人能建议我如何做到这一点吗?

您没有AVR编程经验与实现NMEA无关。但是知道C会有所帮助;)

您的给定表示纬度='23.353434333',经度='45.34333345'称为十进制度数(您的示例缺少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.0131006,1.2,E,A*13

我用粗体突出显示了坐标信息。实现转换并没有什么特别的,而实现NMEA协议则需要对实现细节进行一些额外的阅读。

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
}

将NMEA十进制小数度数值转换为度/分/秒第一将十进制十进制值转换为十进制:5144.385(ddmm.mmm)=51 44.3855=51+44.3855/60=51.7397583度

然后将小数转换为度,分-秒:51度+0.7397583*60=44.385498=44分钟.385498=23.1秒结果:51 44’23.1"