智能家居設(shè)計(jì)與開(kāi)發(fā)_第1頁(yè)
智能家居設(shè)計(jì)與開(kāi)發(fā)_第2頁(yè)
智能家居設(shè)計(jì)與開(kāi)發(fā)_第3頁(yè)
智能家居設(shè)計(jì)與開(kāi)發(fā)_第4頁(yè)
智能家居設(shè)計(jì)與開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

成績(jī):成績(jī):電子與信息工程學(xué)院《嵌入式體系結(jié)構(gòu)與編程》項(xiàng)目設(shè)計(jì)報(bào)告書(shū)學(xué)號(hào)同組成員指導(dǎo)教師2015年12月自我總結(jié):自我總結(jié):評(píng)語(yǔ):老師簽名:目錄評(píng)語(yǔ):老師簽名:目錄1第1章引言3第2章工具軟件與技術(shù)根底42.1智能家居系統(tǒng)的開(kāi)發(fā)環(huán)境和工具42.2智能家居系統(tǒng)的技術(shù)路線42.3設(shè)備連接5第3章系統(tǒng)總體設(shè)計(jì)63.1智能家居系統(tǒng)需求分析63.2開(kāi)發(fā)框架63.3具體實(shí)現(xiàn)設(shè)計(jì)7如何點(diǎn)亮LED燈73.3.2Linux內(nèi)核編譯及配置83.3.3內(nèi)核模塊編程9第4章界面設(shè)計(jì)114.1智能家居系統(tǒng)界面設(shè)計(jì)11第5章系統(tǒng)實(shí)現(xiàn)125.1Android客戶端125.2Ubuntu效勞端165.3Ubuntu客戶端185.4Linux內(nèi)核驅(qū)動(dòng)205.5LED裸奔代碼21第6章結(jié)束語(yǔ)23第1章引言當(dāng)今社會(huì),隨著生活質(zhì)量的日益改善和生活節(jié)奏的不斷加快,人們的工作、生活日益信息化。信息化社會(huì)改變了人們的生活方式與工作習(xí)慣,使得家居系統(tǒng)的智能化成為一種消費(fèi)需求,智能家居系統(tǒng)越來(lái)越被重視。因此,將家庭中各種通信設(shè)備、家用電器和家庭安保裝置通過(guò)家居控制系統(tǒng)進(jìn)行整合,并進(jìn)行遠(yuǎn)程控制和管理,已經(jīng)成為近年來(lái)一個(gè)熱門研究課題。迄今為止,智能家居還沒(méi)有一個(gè)普遍認(rèn)同的統(tǒng)一的定義。通常智能家居系統(tǒng)利用先進(jìn)的計(jì)算機(jī)和網(wǎng)絡(luò)通訊技術(shù)將與家居生活有關(guān)的各種各樣的子系統(tǒng),通過(guò)特定的網(wǎng)絡(luò)有機(jī)地結(jié)合在一起,通過(guò)科學(xué)管理,讓家居生活更加舒適、有效、平安和節(jié)能。以住宅為平臺(tái),兼?zhèn)浣ㄖ?、網(wǎng)絡(luò)通信、信息家電、設(shè)備自動(dòng)化,集系統(tǒng)、結(jié)構(gòu)、效勞、管理、控制為一體的高效、舒適、平安、便利、環(huán)保的居住環(huán)境。智能家居包含智能照明、電動(dòng)窗簾、背景音樂(lè)、安防報(bào)警、樓宇對(duì)講、遠(yuǎn)程控制等方面。傳統(tǒng)的家居智能控制系統(tǒng)一般采用有線方式來(lái)組建,如同軸電纜、USB、CAN總線等。但有線網(wǎng)絡(luò)具有布線麻煩,可擴(kuò)展性差等固有的缺點(diǎn),限制了有線網(wǎng)絡(luò)技術(shù)在智能家居系統(tǒng)中的開(kāi)展。因此,基于物聯(lián)網(wǎng),將無(wú)線網(wǎng)絡(luò)技術(shù)應(yīng)用于家庭網(wǎng)絡(luò)己成為大勢(shì)所趨。這不僅僅因?yàn)闊o(wú)線網(wǎng)絡(luò)具有更大的靈活性、流動(dòng)性,省去了布線的麻煩,更重要的是它符合家居控制網(wǎng)絡(luò)的通訊特點(diǎn)。無(wú)線家居網(wǎng)絡(luò)將人們生活與工作的廣袤空間濃縮于人類的雙手可以掌控的距離。此次我們圍繞基于網(wǎng)絡(luò)的智能家居系統(tǒng)開(kāi)發(fā),簡(jiǎn)單的實(shí)現(xiàn)了使用網(wǎng)絡(luò)對(duì)嵌入式設(shè)備的控制。第2章工具軟件與技術(shù)根底2.1智能家居系統(tǒng)的開(kāi)發(fā)環(huán)境和工具智能家居系統(tǒng)的開(kāi)發(fā)工具主要是:Ubuntu系統(tǒng)、putty、Eclipse。Ubuntu〔烏班圖〕是一個(gè)以桌面應(yīng)用為主的基于Linux內(nèi)核開(kāi)發(fā)的操作系統(tǒng),其名稱來(lái)自非洲南部祖魯語(yǔ)或豪薩語(yǔ)的“ubuntu”一詞,意思是“人性”、“我的存在是因?yàn)榇蠹业拇嬖凇?,是非洲傳統(tǒng)的一種價(jià)值觀,類似華人社會(huì)的“仁愛(ài)”思想。Ubuntu基于Debian發(fā)行版和GNOME桌面環(huán)境,而從11.04版起,Ubuntu發(fā)行版放棄了Gnome桌面環(huán)境,改為Unity,與Debian的不同在于它每6個(gè)月會(huì)發(fā)布一個(gè)新版本。Ubuntu的目標(biāo)在于為一般用戶提供一個(gè)最新的、同時(shí)又相當(dāng)穩(wěn)定的主要由自由軟件構(gòu)建而成的操作系統(tǒng)。Ubuntu具有龐大的社區(qū)力量,用戶可以方便地從社區(qū)獲得幫助。2013年1月3日,Ubuntu正式發(fā)布面向智能的移動(dòng)操作系統(tǒng)。ubuntu基于linux的免費(fèi)開(kāi)源桌面PC操作系統(tǒng),十分契合英特爾的超極本定位,支持x86、64位和ppc架構(gòu)。putty是一個(gè)Telnet、SSH、rlogin、純TCP以及串行接口連接軟件。較早的版本僅支持Windows平臺(tái),在最近的版本中開(kāi)始支持各類Unix平臺(tái),并打算移植至MacOSX上。除了官方版本外,有許多第三方的團(tuán)體或個(gè)人將putty移植到其他平臺(tái)上,像是以Symbian為根底的移動(dòng)。putty為一開(kāi)放源代碼軟件,主要由SimonTatham維護(hù),使用MITlicence授權(quán)。隨著Linux在效勞器端應(yīng)用的普及,Linux系統(tǒng)管理越來(lái)越依賴于遠(yuǎn)程。在各種遠(yuǎn)程登錄工具中,Putty是出色的工具之一。putty是一個(gè)免費(fèi)的、Windows32平臺(tái)下的telnet、rlogin和ssh客戶端,但是功能絲毫不遜色于商業(yè)的telnet類工具。Eclipse是一個(gè)開(kāi)放源代碼的、基于Java的可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組效勞,用于通過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。幸運(yùn)的是,Eclipse附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開(kāi)發(fā)工具〔JavaDevelopmentKit,JDK〕。使用Eclipse添加AndroidSDK和ADT后可進(jìn)行Android工程的編寫(xiě)。2.2智能家居系統(tǒng)的技術(shù)路線智能家居系統(tǒng)采用C-S模式,客戶端基于Android開(kāi)發(fā),效勞端基于C開(kāi)發(fā),效勞端與客戶端采用Socket網(wǎng)絡(luò)編程來(lái)進(jìn)行通訊。效勞端主要對(duì)開(kāi)發(fā)板上各傳感器的數(shù)據(jù)進(jìn)行處理、響應(yīng)客戶端的各種請(qǐng)求,效勞端主要對(duì)從效勞器獲取的信息進(jìn)行處理展示,同時(shí)給效勞器發(fā)送控制信息,進(jìn)行從而實(shí)現(xiàn)對(duì)開(kāi)發(fā)板上某些功能部件的的控制。主要用到的技術(shù)是:JavaSocket編程、CSocket編程、Ubuntu下Vim編輯器的使用、Linux網(wǎng)絡(luò)編程、相關(guān)驅(qū)動(dòng)的開(kāi)發(fā)、putty串口連接開(kāi)發(fā)板、TFTP〔簡(jiǎn)單文件傳輸協(xié)議〕進(jìn)行文件下載。2.3設(shè)備連接開(kāi)發(fā)板的串口與計(jì)算機(jī)串口使用串口線進(jìn)行連接,將開(kāi)發(fā)板使用網(wǎng)線接入局域網(wǎng),再將當(dāng)前計(jì)算機(jī)接入當(dāng)前開(kāi)發(fā)板的所在的局域網(wǎng),接通開(kāi)發(fā)板電源,同時(shí)將開(kāi)發(fā)板、計(jì)算機(jī)中Windows系統(tǒng)和Ubuntu系統(tǒng)下三者的IP設(shè)置在同一網(wǎng)段,設(shè)置開(kāi)發(fā)板、Windows和Ubuntu的網(wǎng)關(guān)為同一網(wǎng)關(guān),此時(shí)開(kāi)發(fā)板的效勞端是Ubuntu。第3章系統(tǒng)總體設(shè)計(jì)3.1智能家居系統(tǒng)需求分析本系統(tǒng)設(shè)計(jì)的目的是向用戶提供一個(gè)通過(guò)網(wǎng)絡(luò)控制智能家居設(shè)備的系統(tǒng)。通過(guò)Socket編程進(jìn)行客戶端和效勞端的通訊,實(shí)現(xiàn)對(duì)智能家居設(shè)備的控制。隨著電子技術(shù)和網(wǎng)絡(luò)技術(shù)的飛速開(kāi)展,人們的生活方式日益發(fā)生著變化,人們對(duì)于生活有了更高層次的追求。大家不再因擁有一個(gè)可以居住的空間而感到滿足,更希望自己的家庭生活是便利的、舒適的、平安的,并且還兼具人性化、智能化,從而產(chǎn)生了智能家居系統(tǒng)[1]。與普通的家居相比,智能家居不僅具有一般的居住功能,也能提供舒適平安、高品位且宜人的家庭生活空間,還能提供全方位的信息交換功能,幫助家庭與外部保持信息交流暢通,優(yōu)化人們的生活方式,幫助人們有效安排時(shí)間,增強(qiáng)家居生活的平安感,節(jié)約能源。因此,智能家居必然成為今后日常生活的一種趨勢(shì)。而對(duì)智能家居系統(tǒng)的需求也將隨著人們對(duì)生活品質(zhì)的追求而發(fā)生著變化,因此,智能家居系統(tǒng)也擁有著良好的開(kāi)展前景。3.2開(kāi)發(fā)框架根本的嵌入式產(chǎn)品框架:開(kāi)發(fā)模式:實(shí)現(xiàn)過(guò)程:3.3具體實(shí)現(xiàn)設(shè)計(jì)如何點(diǎn)亮LED燈1〕原理1.查看S5PC100開(kāi)發(fā)手冊(cè),找到4個(gè)LED燈的對(duì)應(yīng)引腳GPG3_0/3;2.要點(diǎn)亮LED燈,必須在LED兩端有正向壓降,即GPG3_0(LED4),GPG3_1(LED1),GPG3_2(LED2),GPG3_3(LED3)要置為高電平;3.控制存放器:GPG3CON設(shè)置為輸出引腳〔GPG3CON|=0x1111<<0〕;4.數(shù)據(jù)存放器:GPG3DAT設(shè)置為高電平〔GPG3DAT|=0xf<<0〕;2〕運(yùn)行裸奔代碼1.使用C語(yǔ)言編譯點(diǎn)亮LED燈的邏輯代碼;2.設(shè)置好開(kāi)發(fā)板上的參數(shù) --serveripsetserverip+效勞器ip地址 --ipaddrsetipaddr+開(kāi)發(fā)板ip --gatewayipsetgatewayip+網(wǎng)關(guān)測(cè)試開(kāi)發(fā)板與效勞器的連通性 ping+效勞器ip地址3.設(shè)置啟動(dòng)方式setbootcmdtftp0x20008000zImage\;bootm0x20008000〔這里的0x20008000是存放器的地址,我們需要把在Ubuntu下編譯好的文件下載到這個(gè)寄存器〕go0x20008000回車〔LED燈亮〕3.3.2Linux內(nèi)核編譯及配置內(nèi)核模塊編程1〕先進(jìn)入Linux內(nèi)核所在目錄,并調(diào)用topMakefile生成test.o,運(yùn)行MODPOST生成臨時(shí)文件test.mod.c,然后根據(jù)test.mod.c生成test.mod.o(產(chǎn)生了Linux所采用的可執(zhí)行/可鏈接的ELF文件格式)最后,將test.o和test.mod.o鏈接生成test.ko2〕模塊的安裝1.makemodules_install命令把所有的.ko文件拷出來(lái)放到文件系統(tǒng)的/lib/modules/-liy/kernel/下的相應(yīng)目錄(自動(dòng)創(chuàng)立目錄)2.指定安裝系統(tǒng)的路徑放到我們開(kāi)發(fā)板的根文件系統(tǒng)makemodules_installINSTALL_MOD_PATH=/nfs/rootfs3〕注冊(cè)字符設(shè)備驅(qū)動(dòng)linux/fs.hstaticinlineintregister_chrdev(unsignedintmajor,constchar*name,conststructfile_operations*fops)1、major主設(shè)備號(hào)a)內(nèi)核主設(shè)備號(hào)文檔.Documentation/device.txt240-254charLOCAL/EXPERIMENTALUSEb)cat/proc/devicesc)建立設(shè)備文件:mknod/dev/testc2410crw-r--r--100241,0Nov172013/dev/test2、name名字name:設(shè)備驅(qū)動(dòng)名,一看到char*這種類型,很大可能用cat/proc/devices可以看到.3、fops驅(qū)動(dòng)接口集合fops:指針類型,一般情況下如果形參是指針,那么很大可能它會(huì)在調(diào)用函數(shù)中被初始化4〕編譯驅(qū)動(dòng)a.把程序拷貝到虛擬機(jī)b.編譯makemake之后生成一個(gè)可執(zhí)行文件led_driver.ko

c.arm-none-linux-gnueabi-gcc-oappapp.c程序執(zhí)行:a.插入和拔出驅(qū)動(dòng)模塊#insmodled_driver.ko#mknod/dev/ledc2490#./apponled燈亮#./appoffled燈滅第4章界面設(shè)計(jì)4.1智能家居系統(tǒng)界面設(shè)計(jì)此頁(yè)面為系統(tǒng)首頁(yè),已注冊(cè)過(guò)的用戶輸入自己的用戶名和密碼登錄智能家居系統(tǒng)。登錄后即可將以設(shè)置的命令自動(dòng)發(fā)送至效勞器,效勞器接受命令后執(zhí)行相關(guān)代碼,即可完成對(duì)開(kāi)發(fā)板的控制。第5章系統(tǒng)實(shí)現(xiàn)本系統(tǒng)設(shè)計(jì)的目的是向用戶提供一個(gè)使用AndroidAPP客戶端并通過(guò)網(wǎng)絡(luò)控制智能家居設(shè)備的系統(tǒng)。原理是基于Socket編程進(jìn)行客戶端和效勞端的通訊,實(shí)現(xiàn)對(duì)智能家居設(shè)備的控制。5.1Android客戶端Android客戶端用Eclipse進(jìn)行編程,使用Java語(yǔ)言,負(fù)責(zé)用戶登錄和命令發(fā)送,具體實(shí)現(xiàn)代碼如下:〔已省略源碼中的導(dǎo)包代碼〕publicclassMainActivityextendsActivity{ privateEditTexteditText_name; privateEditTexteditText_pwd; privateButtonbutton_login;// privateSocketclientSocket; //用來(lái)處理子線程發(fā)送過(guò)來(lái)的消息的 privateHandlermHandler=newHandler(){ //處理消息 publicvoidhandleMessage(android.os.Messagemsg){ switch(msg.what){ case0x11: //獲取消息中的內(nèi)容 Stringbuffer=(String)msg.obj; //展示在UI界面上 Toast.makeText(MainActivity.this,buffer,Toast.LENGTH_SHORT).show(); break; default: break; } }; };@Override //當(dāng)我們運(yùn)行應(yīng)用程序的時(shí)候,就會(huì)自動(dòng)的調(diào)用這個(gè)方法 protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState);//指定這個(gè)Activity所使用的布局 setContentView(R.layout.activity_main);//1.獲取布局中的控件,根據(jù)控件id來(lái)獲取 editText_name=(EditText)findViewById(R.id.editText1); editText_pwd=(EditText)findViewById(R.id.editText2); button_login=(Button)findViewById(R.id.button1);//2.為按鈕設(shè)置監(jiān)聽(tīng)器,用來(lái)監(jiān)聽(tīng)用戶的點(diǎn)擊事件 button_login.setOnClickListener(newOnClickListener(){@Override //當(dāng)用戶點(diǎn)擊按鈕的時(shí)候,會(huì)自動(dòng)的調(diào)用這個(gè)方法 publicvoidonClick(Viewv){ //1.獲取用戶名,密碼 Stringname=editText_name.getText().toString(); Stringpwd=editText_pwd.getText().toString();//2.與效勞端建立連接,就需要?jiǎng)?chuàng)立子線程,并啟動(dòng)子線程 newThread(newConnectionThread(name,pwd)).start();} }); }//創(chuàng)立子線程 publicclassConnectionThreadimplementsRunnable{ privateStringname; privateStringpwd; //構(gòu)造方法 publicConnectionThread(Stringname,Stringpwd){ =name; this.pwd=pwd; } @Override //線程的執(zhí)行體 publicvoidrun(){ try{ //1.與效勞器建立連接 System.out.println("與服務(wù)器建立連接-->>"); clientSocket=newSocket(); clientSocket.connect(newInetSocketAddress("",7775)); //2.獲取網(wǎng)絡(luò)的輸入,輸出流 OutputStreamoutputStream=clientSocket.getOutputStream(); InputStreaminputStream=clientSocket.getInputStream(); //將這個(gè)輸入流轉(zhuǎn)換為緩沖流 BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(inputStream)); //3.接受效勞端的信息 readMsgServer(bufferedReader); //4.發(fā)送用戶名和密碼 writeMsgServer(outputStream,name,pwd); //5.接收效勞端發(fā)送過(guò)來(lái)的驗(yàn)證信息 readMsgServer(bufferedReader); //writeMsgServer(outputStream,"on"); outputStream.write("on".getBytes(),0,"on".length()); outputStream.flush(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } //接收效勞端的信息 publicvoidreadMsgServer(BufferedReaderbufferedReader){ Stringline=""; Stringbuffer=""; try{ //獲取效勞端的數(shù)據(jù) while((line=bufferedReader.readLine())!=null){ if(line.equals("start")){ continue; }elseif(line.equals("end")){ break; }else{ //真正的數(shù)據(jù) buffer=line+buffer; //System.out.println(">>"+buffer.toString()); } } //發(fā)送消息給UI主線程,并展示在UI界面上 Messagemessage=Message.obtain(); message.what=0x11; //消息的類型 message.obj=buffer.toString(); //消息的內(nèi)容 //發(fā)送消息 mHandler.sendMessage(message); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } //發(fā)送消息給效勞端 publicvoidwriteMsgServer(OutputStreamoutputStream,Stringname,Stringpwd){ try{ //發(fā)送用戶名 outputStream.write(name.getBytes(),0,name.length()); outputStream.flush(); //發(fā)送密碼 outputStream.write(pwd.getBytes(),0,pwd.length()); outputStream.flush(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }}5.2Ubuntu效勞端Ubuntu效勞端用與接受客戶端發(fā)送的命令,并執(zhí)行相應(yīng)代碼,完成客戶端對(duì)開(kāi)發(fā)板的控制,使用C語(yǔ)言進(jìn)行編寫(xiě),具體實(shí)現(xiàn)代碼如下:〔已省略源碼中頭文件代碼〕void*do_client(void*arg);intmain(void){intret; intservfd;/*1.建立socket套接字*/ servfd=socket(AF_INET,SOCK_STREAM,0); if(-1==servfd) {perror("socket"); return-1; }/*填充效勞器地址和端口*/ structsockaddr_inservaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; //ipv4 servaddr.sin_port=htons(PORT);//端口號(hào) servaddr.sin_addr.s_addr=inet_addr(SERVIP); //效勞器地址 socklen_tslen=sizeof(servaddr); /*2.bind綁定效勞器的ip地址,端口號(hào)*/ ret=bind(servfd,(structsockaddr*)&servaddr,slen); if(-1==ret) {perror("bind"); return-1; } /*3.listen主動(dòng)監(jiān)聽(tīng)客戶端,客戶端連接最多為100*/ ret=listen(servfd,100); if(-1==ret) {perror("listen"); return-1; }intnewfd; pthread_ttid; while(1) {/*4.accept接受客戶端,并且為新連接的客戶端 分配一個(gè)新的文件描述符去操作它*/ newfd=accept(servfd,NULL,NULL); if(newfd<0) {continue;} printf("==>%dconnectsuccess...\n",newfd); /*為每個(gè)客戶創(chuàng)立一個(gè)線程去維護(hù)它*/ ret=pthread_create(&tid,NULL,do_client,&newfd); if(0!=ret) {perror("pthread_create"); return-1; } pthread_detach(tid);} close(servfd);return0;}void*do_client(void*arg){intnewfd=*(int*)arg; charbuf[BUFSZ]={0}; intret; char*str="haveatryandyouwillgofar";while(1) {/*5.通信*/ memset(buf,0,sizeof(buf)); ret=read(newfd,buf,sizeof(buf)-1); if(ret>0) {printf("readdata:%s\n",buf); /*發(fā)送數(shù)據(jù)給客戶端*/ write(newfd,str,strlen(str)); }}pthread_exit(NULL);}5.3Ubuntu客戶端Ubuntu客戶端用與工程初期,Android客戶端尚未開(kāi)發(fā)時(shí),測(cè)試效勞端接所編寫(xiě)的基于C語(yǔ)言的Ubuntu客戶端,具體實(shí)現(xiàn)代碼如下:〔已省略源碼中頭文件代碼〕intmain(void){ intclifd; intret; charbuf[BUFSZ];/*1.建立socket套接字*/ clifd=socket(AF_INET,SOCK_STREAM,0); if(-1==clifd) {perror("socket"); return-1; }/*填充效勞器地址和端口*/ structsockaddr_inservaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; //ipv4 servaddr.sin_port=htons(PORT);//端口號(hào) servaddr.sin_addr.s_addr=inet_addr(SERVIP); //效勞器地址 socklen_tslen=sizeof(servaddr); /*2.conenct效勞器*/ ret=connect(clifd,(structsockaddr*)&servaddr,slen); if(-1==ret) {perror("connect"); return-1; } structpollfdpfd[2]; pfd[0].fd=0; pfd[0].events=POLLIN;//不阻塞的讀pfd[1].fd=clifd; pfd[1].events=POLLIN;//不阻塞的讀/*3.通信*/ while(1) {ret=poll(pfd,2,-1); if(ret>0) {//至少有一個(gè)文件描述符返回 if(pfd[0].revents==POLLIN) {/*從終端讀取數(shù)據(jù)*/ memset(buf,0,sizeof(buf)); ret=read(0,buf,sizeof(buf)-1); if(ret>0) {write(clifd,buf,ret);} } if(pfd[1].revents==POLLIN) {/*效勞器接收數(shù)據(jù)*/ memset(buf,0,sizeof(buf)); ret=read(clifd,buf,sizeof(buf)-1); if(ret>0) {printf("serversay:%s\n",buf);} } } else {/*錯(cuò)誤或者超時(shí)*/ break; } } close(clifd);return0;}5.4Linux內(nèi)核驅(qū)動(dòng)intmain(intargc,char**argv){ intfd; if(argc<2) { printf("Usage:on/off\n"); return-1; } fd=open("/dev/led",O_RDWR); if(fd<0) { perror("open"); return-1; } if(!strncasecmp("on",argv[1],2)) ioctl(fd,LED_ON); elseif(!strncasecmp("off",argv[1],3)) ioctl(fd,LED_OFF); return0;}5.5LED裸奔代碼LED裸奔代碼用于控制CPU引腳電壓,從而間接控制LED的點(diǎn)亮與熄滅,具體實(shí)現(xiàn)代碼如下:〔已省略源碼中的頭文件〕#defineGPG3CON(*(volatileunsignedlong*)0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論