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

问题描述 投票:0回答:3

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

纬度='23.353434333' 和经度='45.34333345'

我需要使用 ATmega32 将上述消息转换为 NMEA GPS 格式,但由于我不知道 AVR 编程,有人可以建议我如何做或上面的代码吗?

c++ c gps avr nmea
3个回答
1
投票

您没有 AVR 编程经验与实施 NMEA 无关。然而,了解 C 会有所帮助;)

您给定的表示形式 latitude='23.353434333' 和 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 协议需要额外阅读实施细节。


0
投票
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
}

-1
投票

将 NMEA 十进制度数度值转换为度/分/秒 第一的。将 decimal-decimal 值转换为十进制: 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"

© www.soinside.com 2019 - 2024. All rights reserved.