从GPS/北斗模块中获取经纬度

发布时间:2023-05-31  

一、前言

  GPS/北斗模块基本上都是通过串口发送数据的,并且发送数据的频率是1Hz,发送的数据内容可以去搜索“GPS数据格式”,反正这个模块发回来的数据很多,其中经纬度数据是包含在这些数据里面的。并且模块发回来的全部都是字符串,因此从GPS/北斗模块获取经纬度,实际上就是一个字符串解析的过程。

  比如:$GNRMC,143147.000,A,3413.64266,N,10851.97266,E,000.8,296.4,170821,,,A*7C

  这一帧数据里面就包含了经纬度,但数据格式是ddmm.mmmmm格式,比如这帧数据里面,“3413.64266”这个数是34度加13.64266分,分到度是60进制,因此要把分转换成度需要把分除以60,意思是13.64266分等于13.64266 / 60 = 0.227378度,那么3413.64266这个数就是34.227378度。同理经度也是一样。

  另外程序里还有一个坑,由于使用了atoi函数,使用这个函数需要包含stdlib.h,神奇的是在不包含stdlib.h的情况下编译程序也能通过,并且运行时也不会报错,但是atoi函数返回的结果是不对的。

二、代码

  程序代码很简单,编译时需要将uart.c也加入编译,并且要加-lm参数。uart.c参见我的另一篇博客:linux串口编程

  1 /**

  2  * filename: gps.c

  3  * author: Suzkfly

  4  * date: 2021-08-21

  5  * platform: S3C2416

  6  * 编译时要加-lm

  7  */

  8  

  9 #include

 10 #include

 11 #include

 12 #include /* 必须要包含stdlib.h,不然编译能通过,运行也不会报错,但atof函数运行的结果是错误的 */

 13 #include "uart.h"

 14 

 15 /**

 16  * brief 从GPS/北斗模块中得到经纬度

 17  *

 18  * param[in] fd:打开的串口设备的文件描述符

 19  * param[out] p_lon:得到的经度

 20  * param[out] p_lat:得到的纬度

 21  *

 22  * retval 成功返回0,失败返回-1

 23  */

 24 int get_gps (int fd, char *p_lon, char *p_lat)

 25 {

 26     char buf[256] = { 0 };

 27     int  ret = 0;

 28     FILE *p_file = NULL;

 29     char *p_tmp = NULL;

 30     char lon_tmp[32] = { 0 };

 31     char lat_tmp[32] = { 0 };

 32     double d_lon = 0;

 33     double d_lat = 0;

 34     double d_tmp1 = 0;

 35     double d_tmp2 = 0;

 36     

 37     if ((p_lon == NULL) || (p_lat == NULL)) {

 38         return -1;

 39     }

 40     

 41     /* 文件描述符转文件流指针,为了方便获取一行数据 */

 42     p_file = fdopen(fd, "r");

 43     

 44     while (1) {

 45         p_tmp = fgets(buf, sizeof(buf), p_file);    /* 获取一行数据 */

 46         if (p_tmp == NULL) {

 47             continue;

 48         }

 49         

 50         if (strstr(buf, "$GNGGA") || strstr(buf, "$GPGGA")) {

 51             strtok(buf, ",");

 52             strtok(NULL, ",");

 53             p_tmp = strtok(NULL, ",");  

 54             strcpy(lat_tmp, p_tmp);   /* 第3次strtok得到纬度(度分格式) */

 55             

 56             strtok(NULL, ",");

 57             p_tmp = strtok(NULL, ",");

 58             strcpy(lon_tmp, p_tmp);   /* 第5次strtok得到经度(度分格式) */

 59             break;

 60         } else if (strstr(buf, "$GNRMC") || strstr(buf, "$GPRMC")) {

 61             strtok(buf, ",");

 62             strtok(NULL, ",");

 63             strtok(NULL, ",");

 64             p_tmp = strtok(NULL, ",");  

 65             strcpy(lat_tmp, p_tmp);   /* 第4次strtok得到纬度(度分格式) */

 66             

 67             strtok(NULL, ",");

 68             p_tmp = strtok(NULL, ",");

 69             strcpy(lon_tmp, p_tmp);   /* 第6次strtok得到经度(度分格式) */

 70             break;

 71         }

 72     }

 73     

 74     /* 将度分格式转换为度格式 */

 75     d_lon = atof(lon_tmp);

 76     d_lat = atof(lat_tmp);

 77     d_lon /= 100;

 78     d_lat /= 100;

 79     

 80     d_tmp1 = floor(d_lon);

 81     d_tmp2 = d_lon - d_tmp1;

 82     d_tmp2 *= 100;

 83     d_tmp2 /= 60;

 84     d_lon = d_tmp1 + d_tmp2;

 85     

 86     d_tmp1 = floor(d_lat);

 87     d_tmp2 = d_lat - d_tmp1;

 88     d_tmp2 *= 100;

 89     d_tmp2 /= 60;

 90     d_lat = d_tmp1 + d_tmp2;

 91         

 92     sprintf(p_lon, "%f", d_lon);

 93     sprintf(p_lat, "%f", d_lat);

 94     

 95     return 0;

 96 }

 97 

 98 /**

 99  * brief example

100  */

101 int main(int argc, const char *argv[])

102 {

103     int fd = 0;

104     int ret = 0;

105     int pid = 0;

106     char buf[128] = { 0 };

107     int len = 0;

108     int i = 0;

109     char lon[32] = { 0 };

110     char lat[32] = { 0 };

111     

112     /* 打开串口设备 */

113     fd = uart_open(UART_DEV_PATH);

114     if (fd < 0) {

115         printf("open %s failedn", UART_DEV_PATH);

116         return -1;

117     }

118 

119     /**

120      * 配置串口:

121      * 波特率:BAUD_RATE

122      * 数据位:8

123      * 校验  :无校验

124      * 停止位:1

125      * 流控  :无流控

126      */

127     ret = uart_set(fd, BAUD_RATE, 8, 'n', 1, 'n');

128     if (ret == -1) {

129         perror("uart set failedn");

130         return -1;

131     }

132     

133     /* 得到GPS/北斗模块的经纬度 */

134     ret = get_gps(fd, lon, lat);

135     if (ret != 0) {

136         perror("get_gps errorn");

137         return -1;

138     }

139     

140     printf("Original Longitude = %sn", lon);

141     printf("Original Latitude = %sn", lat);

142     

143     return 0;

144 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    /H)。对于终端而言,其覆盖的地理范围相对于地球半径来说几乎可以看作无穷小,故可以认为电子地图所对应的经纬度坐标在其覆盖的区域内是线性变化的。有了这2个点的坐标数据后,当从GPS接收机读取到经纬度坐标......
    如何使用STM32F103C8的GPS模块获取位置坐标;GPS代表全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。该设备每秒接收来自卫星的坐标,包括......
    求解雅可比矩阵以及泰勒级数线性化只具有一阶的低精度问题,其逼近精度可达二阶或二阶以上。U KF算法实现过程如下 Step1 (1) 式中,x为未失星前时刻北斗双天线定位所得定位经纬度信息;px是x的协方差;n表示系统状态维数;北斗应用中n取值为2;λ......
    周期的设置、GPS数据类型选择和通信波特率等控制命令和接收GPS定位信息。通过串行口UART1发送AT指令实现控制GSM的工作和传送SMS。LCD显示当前的经纬度和时间等信息,按键用来控制是否发送信号。 4.2......
    角检测法是最常见的摔倒检测方法之一,但因为现有倾斜角传感器的局限性,设备必须以特定或几种方式放置,在成本控制方面存在一定的局限性。本文研发的老年人防走丢与摔倒警报系统(以下简称系统)能实现GPS定位经纬度......
    加汽车驾驶的舒适性和安全性的车载系统,ADAS系统的组成结构一般分为三部分: 1、GPS模块和CCD相机探测模块 通过GPS接收机接收GPS卫星信号,求出该车的经纬度坐标、速度、时间等信息,利用......
    延迟引起的测距误差等,因此在至少收到三颗卫星后,即可计算出平面坐标经纬度)值,收到四颗则可在计算出方程值,这就是GPS 的基本定位原理。 图 2 GPS 定位原理图 程式中各个参数意义如下: x,y,z......
    情况下给你偏个几十米都是对的起你了。为此有两种常见解决方案:差分基站纠偏和地图通行大数据纠偏。这能给你造成一种错觉:卫星定位还是蛮准的。不管怎么弄,最后得到的坐标位置是经纬度,但跟常规GIS(Geographic......
    从GPS/北斗模块中获取经纬度;一、前言   GPS/北斗模块基本上都是通过串口发送数据的,并且发送数据的频率是1Hz,发送的数据内容可以去搜索“GPS数据格式”,反正这个模块发回来的数据很多,其中经纬度......
    蜂鸣器   }   别的;   为了接收 GPS 坐标,编写的代码不断检查串行终端是否有来自 GPS 模块的传入数据。当找到具有 GPS 坐标的有效数据时,将其存储在两个单独的变量中,即纬度和经度。   而......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>