《鸿蒙智能互联设备开发(微课版)》 课件 8.2.4 GPS驱动开发_第1页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.4 GPS驱动开发_第2页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.4 GPS驱动开发_第3页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.4 GPS驱动开发_第4页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.4 GPS驱动开发_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.2.4GPS驱动开发通过本节学习,您可以:了解PGS模块的驱动开发GPS驱动开发GPS模块需要先通过启动引脚来启动模块,启动后GPS模块会采集定位信息并通过串口发送给stm32f103,stm32f103采集到定位信息后进行解析,再与速度信息一起通过IIC接口发送给stm32mp157。1.启动GPS模块(1)GPS模块通过stm32mp157的PE8引脚输出高电平启动。宏定义PE8引脚。PE8引脚为72号引脚,在库函数BM_Module_GPIO.c将该引脚定义为MODULE_IO_12,所以只需要对MODULE_IO_12进行宏定义即可。caseMODULE_IO_12://PE8

return72;

...#defineQC_StartMODULE_IO_12//宏定义启动GPS引脚初始化PE8引脚。调用库函数BM_Module_GPIO.c中的“MODULE_GPIOInit()”函数即可对引脚初始化。将引脚配置为上拉输出模式。MODULE_GPIOInit(QC_Start,MODULE_GPIO_Out_PullUp);//初始化启动GPS引脚GPS驱动开发1.启动GPS模块(2)启动GPS模块。调用库函数BM_Module_GPIO.c中的“MODULE_GPIOWrite()”函数使PE8脚输出高电平时启动GPS模块。

voidQC_Init(void)

{

MODULE_GPIOInit(QC_Beep,MODULE_GPIO_Out_PullNone);//初始化蜂鸣器

MODULE_GPIOInit(QC_Light,MODULE_GPIO_Out_PullNone);//初始化补光灯引脚

MODULE_GPIOInit(QC_Start,MODULE_GPIO_Out_PullUp);//初始化启动GPS引脚

MODULE_GPIOWrite(QC_Start,1);//设置输出高电平启动GPS

}GPS驱动开发2.获取GPS模块定位信息GPS模块采集到数据后通过IIC1发送给stm32mp157,stm32mp157截取GPS模块采集的GPRMC格式数据,对此格式数据进行解析就可以得到经纬度信息。(1)获取GPS数据。通过IIC1获取到数据,再通过解析函数解析经纬度信息。

voidQC_gps(void)

{

uint8_tRead_Buff_gps[100]={0};

...

MODULE_IICRead(0xA2,Read_Buff_gps,90);//读取数据

NMEA_BDS_GPRMC_Analysis(&gpsmsg,Read_Buff_gps);//解析数据

...

}GPS驱动开发2.获取GPS模块定位信息(2)经纬度解析函数。解析GPRMC格式数据,提取数据中的经纬度信息。GPRMC格式数据例如:$GPRMC,090634.000,A,2812.7182,N,11252.7955,E,0.23,29.82,270421,,,A*5A需要解析的纬度数据为第三个逗号到第四个逗号的数据2812.7182,小数点前两位为分,两位前的为度。解析出来为28度12分。需要解析的经度数据为第五个逗号到第六个逗号的数据为11252.7955,小数点前两位为分,两位前的为度。解析出来为112度52分。GPS驱动开发GPRMC格式数据解析。先通过“strstr()”函数在GPS模块回传的数据中找出GPRMC格式数据的首地址,如上例为“$”的地址。根据“NMEA_Comma_Pos()”函数得出GPRMC格式数据到第三个逗号的长度,纬度为数据“$GPRMC,090634.000,”的长度20,经度数据“$GPRMC,090634.000,A,2812.7182,N,”的长度32。数据计算:GPRMC格式数据的首地址(“$”的地址)加上此长度(20)就是纬度数据的地址(“2812.7182”中第一个“2”的地址),通过“NMEA_Pow()”函数将纬度数据转换成整型得到“2812”,最后将纬度数据除100得到纬度数据“28.12”,代表纬度为28度12分。经度计算只有加上长度为32不一样,其余原理一样。GPS驱动开发

voidNMEA_BDS_GPRMC_Analysis(gps_msg*gpsmsg,u8*buf)

{

u8*p4,dx;

u8posx;

u32temp;

p4=(u8*)strstr((const

char*)buf,"$GPRMC");//判断$GPRMC首地址.

if(p4!=NULL){

posx=NMEA_Comma_Pos(p4,L80R_CONSTANT_3);//得到纬度

if(posx!=0XFF){

temp=NMEA_Str2num(p4+posx,&dx);

gpsmsg->latitude_bd=temp;

}

posx=NMEA_Comma_Pos(p4,L80R_CONSTANT_5);//得到经度

if(posx!=0XFF){

temp=NMEA_Str2num(p4+posx,&dx);GPS驱动开发

gpsmsg->longitude_bd=temp;

}

}

memset(buf,0,sizeof(buf));

}

voidQC_gps(void)

{

...

NMEA_BDS_GPRMC_Analysis(&gpsmsg,Read_Buff_gps);//解析数据

Longitude=(float)((float)gpsmsg.longitude_bd/L80R_DATA_LEN);

Latitude=(float)((float)gpsmsg.latitude_bd/L80R_DATA_LEN);

printf("\r\nLongitude:%f\r\n",Longitude);

printf("\r\nLatitude:%f\r\n",Latitude);

}GPS驱动开发数据提取与转换。先用循环一个一个字符判断是否为“.”,并记录有多少个字符。当字符为“.”时跳出循环。以纬度数据提取为例:输入为“2812.7182”的第一个“2”的地址,先进入循环判断“2”是不是“.”,不是地址加1数据长度也加1,进入下个循环直到“.”退出,此时为“2812”的长度4。再将数据一个一个字符转换为整数并通过幂函数“NMEA_Pow()”乘相应的位数得到整型的“2812”纬度数据。GPS驱动开发

intNMEA_Str2num(u8*buf,u8*dx)

{

u8*p=buf;

u32ires=0;

u8ilen=0,i;

u8mask=0;

intres;

while(1)

{

if(*p=='-'){

mask|=0x02;

p++;

}//说明有负数

if(*p==','||*p=='*'){

break;//遇到结束符

}

if(*p=='.'){//遇到小数点

break;GPS驱动开发

}else

if(*p>'9'||(*p<'0')){//数字不在0和9之内,说明有非法字符

ilen=0;

break;

}

ilen++;//str长度加一

p++;//下一个字符

}

if(mask&0x02){

buf++;//移到下一位,除去负号

}

for(i=0;i<ilen;i++){//得到整数部分数据

ires+=NMEA_Pow(L80R_CONSTANT_10,ilen-1-i)*(buf[i]-'0');

}

res=ires;

if(mask&0x02)

res=-res;

returnres;

}GPS驱动开发编写幂函数。计算n个m相乘,主要用来将单个整型数据赋予位数。

u32NMEA_Pow(u8m,u8n)

{

u32result=1;

while(n--){

result*=m;

}

returnresult;}GPS驱动开发从字符串里面得到第几个逗号所在的位置。通过循环每次都判断字符是否为“,”,每次循环地址加1。当循环到“,”时第几个逗号就减1,当减到0时代表地址已经到第几个逗号所在的位置跳出循环。再将字符串的首地址减去此时位置的地址就可以得到第几个逗号前所有字符的数量。

u8NMEA_Comma_Pos(u8*buf,u8cx)

{

u8*p=buf;

while(cx){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论