GPS高度測(cè)量-物聯(lián)網(wǎng)綜合課程設(shè)計(jì)_第1頁(yè)
GPS高度測(cè)量-物聯(lián)網(wǎng)綜合課程設(shè)計(jì)_第2頁(yè)
GPS高度測(cè)量-物聯(lián)網(wǎng)綜合課程設(shè)計(jì)_第3頁(yè)
GPS高度測(cè)量-物聯(lián)網(wǎng)綜合課程設(shè)計(jì)_第4頁(yè)
GPS高度測(cè)量-物聯(lián)網(wǎng)綜合課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第2章詳細(xì)設(shè)計(jì)方案2.1課程設(shè)計(jì)環(huán)境搭建嵌入式開發(fā)環(huán)境一般為L(zhǎng)inux環(huán)境,通常的嵌入式系統(tǒng)的軟件開發(fā)采用一種交叉編譯調(diào)試的方式。交叉編譯調(diào)試環(huán)境建立在宿主機(jī)(即一臺(tái)PC機(jī))上,對(duì)應(yīng)的開發(fā)板叫做目標(biāo)板。宿主機(jī)和目標(biāo)板的處理器一般不相同,宿主機(jī)為x86處理器,而目標(biāo)板如凌陽(yáng)的A8實(shí)驗(yàn)箱為三星S5PV210,其為ARMA8架構(gòu)的處理器。GNU編譯器提供這樣的功能,在編譯器編譯時(shí)可以選擇開發(fā)所需的宿主機(jī)和目標(biāo)機(jī)從而建立開發(fā)環(huán)境。所以在進(jìn)行嵌入式開發(fā)前第一步的工作就是要安裝一臺(tái)裝有指定操作系統(tǒng)的PC機(jī)作宿主開發(fā)機(jī),對(duì)于嵌入式Linux,宿主機(jī)上的操作系統(tǒng)一般要求為L(zhǎng)inux的各種發(fā)行版,本次課程設(shè)計(jì)采用Ubuntu10.10,同時(shí)安裝gcc交叉編譯器。環(huán)境搭建流程如圖:2.1.1Ubuntu10.10的安裝嵌入式Linux的PC開發(fā)環(huán)境有幾個(gè)方案:基于PC機(jī)Windows操作系統(tǒng)下Cygwin2.在Windows下安裝虛擬機(jī)后,再在虛擬機(jī)中安裝Linux操作系統(tǒng)3.直接安裝Linux操作系統(tǒng)以上三種方案各有千秋,方案一容易存在兼容性問題;方案二在PC配置比較低的情況下會(huì)比較慢,但是既可以使用Windows上的一些軟件又可以使用到比較好的Linux環(huán)境,熟悉Windows的用戶用此方案比較順手;方案三無法使用Windows上的一些常用軟件,并且不熟悉的人操作起來比較困難。簽于此筆者建議初學(xué)者選擇方案二。方案二首先要在Windows上安裝一個(gè)虛擬機(jī)軟件,常用的虛擬機(jī)軟件為Vmware。然后再在Vmware上安裝Ubuntu10.10。在安裝完Ubuntu10.10后還要安裝嵌入式Linux的交叉編譯器和開發(fā)庫(kù)以及ARM-Linux的所有源代碼,這些包安裝后的總共需要空間大約為800M。2.1.2通過網(wǎng)線和串口將PC和A8實(shí)驗(yàn)箱進(jìn)行連接通過操作PC機(jī)的超級(jí)終端登陸實(shí)驗(yàn)箱的系統(tǒng),通過網(wǎng)線連接是有兩種方案:1.實(shí)驗(yàn)箱的以太網(wǎng)接口與PC的網(wǎng)卡直接相連。2.將實(shí)驗(yàn)箱與路由器相連。當(dāng)在實(shí)驗(yàn)室通過方案2連接PC機(jī)和A8實(shí)驗(yàn)箱時(shí),容易出現(xiàn)ip沖突等問題,所以直接將用網(wǎng)線將實(shí)驗(yàn)箱的以太網(wǎng)接口和PC的網(wǎng)卡直接相連。此時(shí)需要將A8實(shí)驗(yàn)箱和PC機(jī)設(shè)置在同一網(wǎng)段才能正常通信。具體步驟如下:通過超級(jí)終端建立連接并登陸到A8實(shí)驗(yàn)箱的系統(tǒng)中(賬號(hào):root,密碼:111111)登陸成功2)對(duì)A8實(shí)驗(yàn)箱的IP進(jìn)行配置,并重啟網(wǎng)絡(luò)服務(wù)器。(主要用到的Linux語(yǔ)句:ipconfigeth0-i00-m-g和servicenetworkrestart)更改IP并重啟網(wǎng)絡(luò)服務(wù)器3)更改主機(jī)電腦的IP(注意將宿主機(jī)和實(shí)驗(yàn)箱IP設(shè)置在同一網(wǎng)段)更改宿主機(jī)IP2.1.3GPS模塊的連接實(shí)驗(yàn)箱引出了GPS接口J33,直接把GPS模組插接到該接口上,即可實(shí)現(xiàn)對(duì)GPS模組的控制。其中GPS模組的復(fù)位信號(hào)由實(shí)驗(yàn)箱GPJ4_0來控制,通信由實(shí)驗(yàn)箱的UART2來完成。按照APM7101的通訊要求,UART通訊波特率為4800或者9600bps。2.1.4軟件設(shè)計(jì)與實(shí)現(xiàn)軟件實(shí)現(xiàn)是本設(shè)計(jì)的重點(diǎn),使用的是嵌入式C語(yǔ)言編程,采用模塊化的設(shè)計(jì)思想,根據(jù)系統(tǒng)要求和相關(guān)的硬件電路。本設(shè)計(jì)中,程序首先通過GPJ4_0輸出GPS模組開啟所需時(shí)序,從而打開GPS模組,接下來即可通過UART2等待從GPS模組中讀取GPS信息,并將這些這些信息進(jìn)行解析,即可得到所需信息。本設(shè)計(jì)的程序流程如下圖所示:圖軟件程序流程圖具體的軟件程序流程為:打開Linux下相應(yīng)的設(shè)備掛載點(diǎn),開啟GPS模塊并進(jìn)行初始化。本設(shè)計(jì)中,程序通過GPJ4_0輸出GPS模組開啟所需時(shí)序,從而打開GPS模組,接下來可通過UART2等待從GPS模組中讀取GPS信息,并將這些信息進(jìn)行解析,即可得到所需信息。打開并設(shè)置UART2屬性。為了實(shí)驗(yàn)箱能夠正確地與PC進(jìn)行通信,必須按照制定要求格式對(duì)通信串口進(jìn)行初始化操作。本設(shè)計(jì)選擇實(shí)驗(yàn)箱主電路板上的UART2串口進(jìn)行與PC的通信,并設(shè)置通信波特率為115200、數(shù)據(jù)位為8位、無奇偶校驗(yàn)位、1位停止位和無數(shù)據(jù)流控制。具體實(shí)現(xiàn)過程可以通過向設(shè)備中發(fā)送起始信號(hào),設(shè)備地址和寫信號(hào),然后發(fā)送內(nèi)部寄存器的地址和數(shù)據(jù),發(fā)送結(jié)束后便發(fā)送停止信號(hào)。讀取GPS信息并解析。GPS模組返回的信息遵循NMEA協(xié)議格式。為了正確無誤地讀取GPS模組中返回的信息,我們必須按照NMEA消息格式對(duì)緩沖區(qū)中的消息進(jìn)行讀取并存儲(chǔ)并通過函數(shù)GetComma(intnum,char*str)得到指定序號(hào)的逗號(hào)位置,以解析各個(gè)定義段?;綨MEA指令是一個(gè)ASCII字符串,它以‘$‘字符開始、以<CR><LF>序列結(jié)束。NMEA標(biāo)準(zhǔn)消息以“GP”開始,接著是三個(gè)字符的消息標(biāo)識(shí)碼。消息頭和后面的內(nèi)容通過逗號(hào)進(jìn)行分隔,消息以校檢碼結(jié)束(校檢碼由一個(gè)‘*’和兩個(gè)16位的校驗(yàn)字組成。校驗(yàn)碼字段并不用逗號(hào)進(jìn)行分隔。目前,校驗(yàn)碼得到的方式是從‘$’到‘*’之間的字符進(jìn)行逐位計(jì)算。)2.2實(shí)施方案按照設(shè)計(jì)原理及設(shè)計(jì)思路在PC機(jī)上編寫程序,保存成.c源代碼文件,并將文件拷貝到Ubuntu系統(tǒng)中。在Ubuntu操作系統(tǒng)中打開一個(gè)終端,進(jìn)入到源程序所在目錄下,在Ubuntu中進(jìn)行交叉編譯,運(yùn)行命令行(通過ls查看查看到GPS216文件):arm-linux-gcc-oGPS216GPS.c在PC機(jī),通過ftp協(xié)議訪問實(shí)驗(yàn)箱的IP地址,將編譯好的GPS216文件傳輸?shù)綄?shí)驗(yàn)箱中。在超級(jí)終端中,賦予文件可執(zhí)行權(quán)限并運(yùn)行。(授權(quán)語(yǔ)句:chmod+xGPS216)第3章調(diào)試及結(jié)果分析3.1調(diào)試3.1.1軟件測(cè)試3.1.2硬件調(diào)試3.2結(jié)果當(dāng)根據(jù)實(shí)驗(yàn)原理設(shè)計(jì)并運(yùn)行后,超級(jí)終端可以出現(xiàn)如下實(shí)驗(yàn)結(jié)果:參考文獻(xiàn)[1]青島東合信息技術(shù)有限公司.無線傳感器網(wǎng)絡(luò)技術(shù)原理及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2013[2]凌陽(yáng)愛普科技有限公司.物聯(lián)網(wǎng)多網(wǎng)技術(shù)綜合教學(xué)開發(fā)平臺(tái)實(shí)驗(yàn)指導(dǎo)書[M],2013[3]王小強(qiáng),歐陽(yáng)俊,黃寧淋.ZigBee無線傳感器網(wǎng)絡(luò)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:化學(xué)工業(yè)出版社,2012[4]凌陽(yáng)愛普科技有限公司.A8實(shí)驗(yàn)箱綜合教學(xué)開發(fā)平臺(tái)實(shí)驗(yàn)指導(dǎo)書[M],2013[5]王毓銀.數(shù)字電路邏輯設(shè)計(jì).高等教育出版社,1999[6]梁德厚.數(shù)字電路技術(shù)及應(yīng)用.機(jī)械工業(yè)出版社,2004[7]楊松華.數(shù)字電子技術(shù)基礎(chǔ).西安電子科技大學(xué)出版社,2000沈陽(yáng)航空航天大學(xué)課程設(shè)計(jì)報(bào)告附錄(關(guān)鍵部分程序清單)#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形式的時(shí)間}date_time;typedefstruct{ date_timeD; //時(shí)間 charstatus; //接收狀態(tài) doublelatitude; //緯度 charlatitude_c[11]; //ASCII形式的緯度 doublelongitude; //經(jīng)度 charlongitude_c[11];//ASCII形式的經(jīng)度 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; //定義串口屬性結(jié)構(gòu)體變量,其中options用于重新設(shè)置串口屬性,oldoptions用于原設(shè)置,用于恢復(fù)到原來的屬性 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);//獲得當(dāng)前的串口設(shè)置信息 tcgetattr(fd,&options); cfsetispeed(&options,B9600);//設(shè)置輸入波特率為115200 cfsetospeed(&options,B9600);//設(shè)置輸出波特率為115200 options.c_cflag&=~PARENB;//設(shè)置串口屬性為:數(shù)據(jù)位為8位,停止位為1位,無奇偶校驗(yàn) 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);//設(shè)置串口為Raw模式 options.c_oflag&=~OPOST; tcsetattr(fd,TCSANOW,&options);//將上述設(shè)置生效 while(1) { GPS_Read(fd,buf,len); if(GPS_Parse(buf,&GPS)) { if(GPS.status=='A') //如果接收到有效的數(shù)據(jù) { printf("時(shí)間:%2d:%2d:%2d\n", //顯示時(shí)間 GPS.D.hour,GPS.D.minute,GPS.D.second); printf("日期:%d年%02d月%02d日\(chéng)n", //顯示日期 GPS.D.year,GPS.D.month,GPS.D.day); printf("此時(shí)的海拔高度為:%10.4f\n",GPS.high); Degree=GPS.latitude/100; //計(jì)算緯度的"度"和"分" 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; //計(jì)算經(jīng)度的"度"和"分" Cent=GPS.longitude-(Degree*100); printf("經(jīng)度:"); //顯示經(jīng)度 if(GPS.EW=='E') printf("東經(jīng)(E)%d度%lf分",Degree,Cent); if(GPS.EW=='W') printf("西經(jīng)(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;}/*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論