GPS高度测量-物联网综合课程设计_第1页
GPS高度测量-物联网综合课程设计_第2页
GPS高度测量-物联网综合课程设计_第3页
GPS高度测量-物联网综合课程设计_第4页
GPS高度测量-物联网综合课程设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

第2章详细设计方案2.1课程设计环境搭建嵌入式开发环境一般为Linux环境,通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发板叫做目标板。宿主机和目标板的处理器一般不相同,宿主机为x86处理器,而目标板如凌阳的A8实验箱为三星S5PV210,其为ARMA8架构的处理器。GNU编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的PC机作宿主开发机,对于嵌入式Linux,宿主机上的操作系统一般要求为Linux的各种发行版,本次课程设计采用Ubuntu10.10,同时安装gcc交叉编译器。环境搭建流程如图:2.1.1Ubuntu10.10的安装嵌入式Linux的PC开发环境有几个方案:基于PC机Windows操作系统下Cygwin2.在Windows下安装虚拟机后,再在虚拟机中安装Linux操作系统3.直接安装Linux操作系统以上三种方案各有千秋,方案一容易存在兼容性问题;方案二在PC配置比较低的情况下会比较慢,但是既可以使用Windows上的一些软件又可以使用到比较好的Linux环境,熟悉Windows的用户用此方案比较顺手;方案三无法使用Windows上的一些常用软件,并且不熟悉的人操作起来比较困难。签于此笔者建议初学者选择方案二。方案二首先要在Windows上安装一个虚拟机软件,常用的虚拟机软件为Vmware。然后再在Vmware上安装Ubuntu10.10。在安装完Ubuntu10.10后还要安装嵌入式Linux的交叉编译器和开发库以及ARM-Linux的所有源代码,这些包安装后的总共需要空间大约为800M。2.1.2通过网线和串口将PC和A8实验箱进行连接通过操作PC机的超级终端登陆实验箱的系统,通过网线连接是有两种方案:1.实验箱的以太网接口与PC的网卡直接相连。2.将实验箱与路由器相连。当在实验室通过方案2连接PC机和A8实验箱时,容易出现ip冲突等问题,所以直接将用网线将实验箱的以太网接口和PC的网卡直接相连。此时需要将A8实验箱和PC机设置在同一网段才能正常通信。具体步骤如下:通过超级终端建立连接并登陆到A8实验箱的系统中(账号:root,密码:111111)登陆成功2)对A8实验箱的IP进行配置,并重启网络服务器。(主要用到的Linux语句:ipconfigeth0-i00-m-g和servicenetworkrestart)更改IP并重启网络服务器3)更改主机电脑的IP(注意将宿主机和实验箱IP设置在同一网段)更改宿主机IP2.1.3GPS模块的连接实验箱引出了GPS接口J33,直接把GPS模组插接到该接口上,即可实现对GPS模组的控制。其中GPS模组的复位信号由实验箱GPJ4_0来控制,通信由实验箱的UART2来完成。按照APM7101的通讯要求,UART通讯波特率为4800或者9600bps。2.1.4软件设计与实现软件实现是本设计的重点,使用的是嵌入式C语言编程,采用模块化的设计思想,根据系统要求和相关的硬件电路。本设计中,程序首先通过GPJ4_0输出GPS模组开启所需时序,从而打开GPS模组,接下来即可通过UART2等待从GPS模组中读取GPS信息,并将这些这些信息进行解析,即可得到所需信息。本设计的程序流程如下图所示:图软件程序流程图具体的软件程序流程为:打开Linux下相应的设备挂载点,开启GPS模块并进行初始化。本设计中,程序通过GPJ4_0输出GPS模组开启所需时序,从而打开GPS模组,接下来可通过UART2等待从GPS模组中读取GPS信息,并将这些信息进行解析,即可得到所需信息。打开并设置UART2属性。为了实验箱能够正确地与PC进行通信,必须按照制定要求格式对通信串口进行初始化操作。本设计选择实验箱主电路板上的UART2串口进行与PC的通信,并设置通信波特率为115200、数据位为8位、无奇偶校验位、1位停止位和无数据流控制。具体实现过程可以通过向设备中发送起始信号,设备地址和写信号,然后发送内部寄存器的地址和数据,发送结束后便发送停止信号。读取GPS信息并解析。GPS模组返回的信息遵循NMEA协议格式。为了正确无误地读取GPS模组中返回的信息,我们必须按照NMEA消息格式对缓冲区中的消息进行读取并存储并通过函数GetComma(intnum,char*str)得到指定序号的逗号位置,以解析各个定义段。基本NMEA指令是一个ASCII字符串,它以‘$‘字符开始、以<CR><LF>序列结束。NMEA标准消息以“GP”开始,接着是三个字符的消息标识码。消息头和后面的内容通过逗号进行分隔,消息以校检码结束(校检码由一个‘*’和两个16位的校验字组成。校验码字段并不用逗号进行分隔。目前,校验码得到的方式是从‘$’到‘*’之间的字符进行逐位计算。)2.2实施方案按照设计原理及设计思路在PC机上编写程序,保存成.c源代码文件,并将文件拷贝到Ubuntu系统中。在Ubuntu操作系统中打开一个终端,进入到源程序所在目录下,在Ubuntu中进行交叉编译,运行命令行(通过ls查看查看到GPS216文件):arm-linux-gcc-oGPS216GPS.c在PC机,通过ftp协议访问实验箱的IP地址,将编译好的GPS216文件传输到实验箱中。在超级终端中,赋予文件可执行权限并运行。(授权语句:chmod+xGPS216)第3章调试及结果分析3.1调试3.1.1软件测试3.1.2硬件调试3.2结果当根据实验原理设计并运行后,超级终端可以出现如下实验结果:参考文献[1]青岛东合信息技术有限公司.无线传感器网络技术原理及应用[M].西安:西安电子科技大学出版社,2013[2]凌阳爱普科技有限公司.物联网多网技术综合教学开发平台实验指导书[M],2013[3]王小强,欧阳俊,黄宁淋.ZigBee无线传感器网络设计与实现[M].北京:化学工业出版社,2012[4]凌阳爱普科技有限公司.A8实验箱综合教学开发平台实验指导书[M],2013[5]王毓银.数字电路逻辑设计.高等教育出版社,1999[6]梁德厚.数字电路技术及应用.机械工业出版社,2004[7]杨松华.数字电子技术基础.西安电子科技大学出版社,2000沈阳航空航天大学课程设计报告附录(关键部分程序清单)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>#include<unistd.h>#include<termios.h>#include<fcntl.h>#include<sys/stat.h>#include<sys/time.h>#include<sys/types.h>#include<sys/ioctl.h>typedefstruct{ intyear; intmonth; intday; inthour; intminute; intsecond; chartime_c[10];//ACSII形式的时间}date_time;typedefstruct{ date_timeD; //时间 charstatus; //接收状态 doublelatitude; //纬度 charlatitude_c[11]; //ASCII形式的纬度 doublelongitude; //经度 charlongitude_c[11];//ASCII形式的经度 charNS; //南北极 charEW; //东西 doublespeed; //速度 charspeed_c[10]; //ASCII形式的速度 doublehigh; //高度}GPS_INFO;intGPS_Read(intfd,char*Data_Buff,intlen);intGetComma(intnum,char*str);voidUTC2BTC(date_time*GPS);doubleGet_Double_Number(char*s);voidGet_Char(char*s);charbuf_t[128];intmain(){ structtermiosoptions,oldoptions; //定义串口属性结构体变量,其中options用于重新设置串口属性,oldoptions用于原设置,用于恢复到原来的属性 GPS_INFOGPS; unsignedintDegree=0; floatCent; charbuf[1024]; intlen=1024; intnByte; intrdadByte; inti=0; intfd; fd=open("/dev/gpJ4",O_RDWR); //openGPJ4 ioctl(fd,0x01,0);//setGPJ4_0output ioctl(fd,0x10,0);//GPJ4_0outputlowlevel usleep(30000); ioctl(fd,0x11,0);//GPJ4_0outputhighlevel fd=open("/dev/s3c2410_serial2",O_RDWR);//openserial2 tcgetattr(fd,&oldoptions);//获得当前的串口设置信息 tcgetattr(fd,&options); cfsetispeed(&options,B9600);//设置输入波特率为115200 cfsetospeed(&options,B9600);//设置输出波特率为115200 options.c_cflag&=~PARENB;//设置串口属性为:数据位为8位,停止位为1位,无奇偶校验 options.c_cflag&=~CSTOPB; options.c_cflag|=CSTOPB; options.c_cflag&=~CSIZE; options.c_cflag&=~CS8; options.c_cflag|=CS8; options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);//设置串口为Raw模式 options.c_oflag&=~OPOST; tcsetattr(fd,TCSANOW,&options);//将上述设置生效 while(1) { GPS_Read(fd,buf,len); if(GPS_Parse(buf,&GPS)) { if(GPS.status=='A') //如果接收到有效的数据 { printf("时间:%2d:%2d:%2d\n", //显示时间 GPS.D.hour,GPS.D.minute,GPS.D.second); printf("日期:%d年%02d月%02d日\n", //显示日期 GPS.D.year,GPS.D.month,GPS.D.day); printf("此时的海拔高度为:%10.4f\n",GPS.high); Degree=GPS.latitude/100; //计算纬度的"度"和"分" Cent=GPS.latitude-(Degree*100); printf("纬度:"); //显示纬度 if(GPS.NS=='N') printf("北纬(N)%d度%lf分",Degree,Cent); if(GPS.NS=='S') printf("南纬(S)%d度%lf分",Degree,Cent); printf("\n"); Degree=GPS.longitude/100; //计算经度的"度"和"分" Cent=GPS.longitude-(Degree*100); printf("经度:"); //显示经度 if(GPS.EW=='E') printf("东经(E)%d度%lf分",Degree,Cent); if(GPS.EW=='W') printf("西经(W)%d度%lf分",Degree,Cent); printf("\n\n\n"); } } }}/*******************************************GPS_Read:readMSGfromGPSmodule ********************************************/intGPS_Read(intfd,char*Data_Buff,intlen){ intcount=0; intFlag=0; while(Flag==0) { read(fd,Data_Buff,1); if(*Data_Buff=='\n') { Flag=1; count=0; } Data_Buff++; } return0;}/*********************************************************GPS_Parse:changeMFSfromGPStosturctGPS_INFO**********************************************************/intGPS_Parse(constchar*line,GPS_INFO*GPS){ inttmp; charc; char*buf; buf=(char*)line; c=buf[5]; if(c=='C'){//"GPRMC" GPS->D.hour=(buf[7]-'0')*10+(buf[8]-'0'); GPS->D.minute=(buf[9]-'0')*10+(buf[10]-'0'); GPS->D.second=(buf[11]-'0')*10+(buf[12]-'0'); tmp=GetComma(9,buf); GPS->D.day=(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0'); GPS->D.month=(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0'); GPS->D.year=(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000; Get_Char(&buf[7]); strcpy(GPS->D.time_c,buf_t); // GPS->status =buf[GetComma(2,buf)]; #defineddd GPS->latitude=Get_Double_Number(&buf[GetComma(3,buf)]); printf("GPS->latitude=%f\n",GPS->latitude); GPS->NS=buf[GetComma(4,buf)]; Get_Char(&buf[GetComma(3,buf)]);strcpy(GPS->latitude_c,buf_t); GPS->longitude=Get_Double_Number(&buf[GetComma(5,buf)]); GPS->EW=buf[GetComma(6,buf)]; Get_Char(&buf[GetComma(5,buf)]); strcpy(GPS->longitude_c,buf_t); UTC2BTC(&GPS->D); return1; }if(c=='A'){//"$GPGGA"GPS->high=Get_Double_Number(&buf[GetComma(9,buf)]);return1;}return0;}/**********************************************************************Get_Double_Number:changestringbeforethefrist','todouble**********************************************************************/doubleGet_Double_Number(char*s){ charbuf[128]; inti; doublerev; i=GetComma(1,s); i=i-1; strncpy(buf,s,i); buf[i]=0; rev=atof(buf); returnrev;}/*******************************************Get_Char:getcharbeforefrist","********************************************/voidGet_Char(char*s){ inti; i=GetComma(1,s); i=i-1; if(i>9)i=9; strncpy(buf_t,s,i); buf_t[i]='\n';}/*******************************************GetComma:getpoistionofnum-th","********************************************/intGetComma(intnum,char*str){ inti,j=0; intlen=strlen(str); for(i=0;i<len;i++) { if(str[i]==',')j++; if(j==num)returni+1; } return0;}/*******************************************UTC2BTC:getBeiJingtime ********************************************/voidUTC2BTC(date_time*GPS){ GPS->second++; if(GPS->second>59){ GPS->second=0; GPS->minute++; if(GPS->minute>59){ GPS->minute=0; GPS->hour++; } }//转化为北京时间//GPS->hour=GPS->hour+8; if(GPS->hour>23) { GPS->hour-=24; GPS->day+=1; if(GPS->month==2|| GPS->month==4|| GPS->month==6|| GPS->month==9|| GPS->month==11){ if(GPS->day>30){ GPS->day=1; GPS->month++; } } else{ if(GPS->day>31){ GPS->day=1; GPS->month++; } } if(GPS->year%4==0){// if(GPS->day>29&&GPS->month==2){ GPS->day=1; GPS->month++; } } else{ if(GPS->day>28&&GPS->month==2){ GPS->day=1; GPS->month++; } } if(GPS->month>12){ GPS->month-=12; GPS->year++; } }}基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工业电阻炉上的应用研究基于双单片机冲床数控系统的研究与开发基于Cygnal单片机的μC/OS-Ⅱ的研究基于单片机的一体化智能差示扫描量热仪系统研究基于TCP/IP协议的单片机与Internet互联的研究与实现变频调速液压电梯单片机控制器的研究基于单片机γ-免疫计数器自动换样功能的研究与实现基于单片机的倒立摆控制系统设计与实现单片机嵌入式以太网防盗报警系统基于51单片机的嵌入式Internet系统的设计与实现单片机监测系统在挤压机上的应用MSP430单片机在智能水表系统上的研究与应用基于单片机的嵌入式系统中TCP/IP协议栈的实现与应用单片机在高楼恒压供水系统中的应用HYPERLINK"/detail

温馨提示

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

评论

0/150

提交评论