版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課 程 設(shè) 計(jì) 書</b></p><p><b> 《嵌入式系統(tǒng)實(shí)訓(xùn)》</b></p><p> 學(xué)院 </p><p> 姓名 </p><p> 學(xué)號
2、 </p><p> 組別 </p><p><b> 1設(shè)計(jì)概述</b></p><p> 能源是經(jīng)濟(jì)發(fā)展和社會進(jìn)步的支柱,能源問題成為當(dāng)今世界各國尤其是發(fā)達(dá)國家所要解決的頭等大事。世界各國都在鼓勵(lì)大力開發(fā)可再生能源。風(fēng)能和太陽能成為當(dāng)下最受歡迎的新能源,也是目前可再生能源應(yīng)用技術(shù)中最成熟的
3、。本設(shè)計(jì)基于人體運(yùn)動出來的機(jī)械能轉(zhuǎn)化成可利用回收的電能,是新能源的一種體現(xiàn),具有很好的開發(fā)前景和實(shí)際用途。</p><p> 該設(shè)計(jì)是基于以stm32f030芯片為主芯片的智能發(fā)電的PCB主板,再利用開關(guān)磁阻電機(jī)進(jìn)行發(fā)電,將其電壓和電流通過wifi模塊發(fā)送給手機(jī)端,通過手機(jī)上的APP可以顯示出電流和電壓值,并進(jìn)行后臺處理和數(shù)據(jù)保存。設(shè)計(jì)將從芯片器件的選型再到PCB板的設(shè)計(jì),之后是PCB板的焊接,再是軟件的編寫與
4、調(diào)試,軟件部分還包括手機(jī)APP的編寫,最終完成本次設(shè)計(jì)。</p><p><b> 設(shè)計(jì)方案</b></p><p> 該設(shè)計(jì)方案可以劃分為兩個(gè)部分,第一部分是終端部分,有發(fā)電機(jī)的驅(qū)動模塊,電壓電流采集模塊,WiFi模塊以和主控芯片及其外設(shè);第二部分是手機(jī)部分,該部分主要是實(shí)現(xiàn)一個(gè)上位機(jī)的功能,包括接收信息,發(fā)送指令,主要有登錄界面和查詢界面。兩部分之間通過WIF
5、I來實(shí)現(xiàn)通信。所以總體設(shè)計(jì)框圖1所示:</p><p> 圖2.1 總體設(shè)計(jì)方案</p><p> 其中手機(jī)端的設(shè)計(jì)為純粹的軟件設(shè)計(jì),而智能發(fā)電系統(tǒng)主體的設(shè)計(jì)方案是方案設(shè)計(jì)中的重點(diǎn)部分包括硬件部分的設(shè)計(jì)與軟件部分的設(shè)計(jì)。該系統(tǒng)的設(shè)計(jì)方案包括以下幾個(gè)方面,一是小車主體電路板的設(shè)計(jì)方案,屬于硬件部分的設(shè)計(jì);二是軟件設(shè)計(jì)方案,屬于軟件部分的設(shè)計(jì),主要是用于驅(qū)動硬件電路和給手機(jī)端APP提供操作
6、接口。</p><p> 該系統(tǒng)主體電路板的設(shè)計(jì)包括電源模塊的設(shè)計(jì),主芯片外圍電路的設(shè)計(jì),WiFi模塊的設(shè)計(jì),電機(jī)驅(qū)動模塊的設(shè)計(jì),各個(gè)傳感器模塊的設(shè)計(jì)。軟件部分的設(shè)計(jì)包括主體函數(shù)的設(shè)計(jì)及各個(gè)功能模塊的設(shè)計(jì),在實(shí)現(xiàn)了各個(gè)功能模塊設(shè)計(jì)的基礎(chǔ)上設(shè)計(jì)出主體程序,以便可以隨時(shí)中斷某一個(gè)功能而去實(shí)現(xiàn)另外的功能。外圍設(shè)計(jì)主要是各個(gè)傳感器的放置位置的選擇,以便達(dá)到所需的功能。</p><p><b
7、> 詳細(xì)設(shè)計(jì)方案 </b></p><p> 2.1.1 電源模塊</p><p> 由于電機(jī)的驅(qū)動需要15V的電源,而USB及傳感器等模塊的供電需要5V的電源,主芯片需要3.3V及1.2V的電源。所以在電源模塊的設(shè)計(jì)中需要用到外部供電電源為15V的可移動電源,可以是蓄電池也可以是干電池串聯(lián)而得。5V的電源通過對15V電源降壓而得到,3.3V電源分別由XC6206P
8、332MR通過不同的外圍電路來獲得。</p><p> 2.1.2 主芯片模塊</p><p> 主芯片在此設(shè)計(jì)中制定為stm32f030作為主控芯片,stm32f030主控芯片的外圍電路包括復(fù)位電路,晶振,過芯片中的USB接口燒錄到SPI FLASH中,選擇的啟動方式是USB啟動。當(dāng)程序燒錄好以后,將啟動方式轉(zhuǎn)換為SPI FLASH啟動。SDRAM中用于存放程序。</p>
9、<p> STM32F030 內(nèi)部有RC振蕩器,可以為內(nèi)部的鎖相環(huán)提供時(shí)鐘,但同外部晶振相比不夠準(zhǔn)確,所以本文使用外部時(shí)鐘源。外部時(shí)鐘源主要分為高速外部振蕩器和低速外部振蕩器,高速外部振蕩器主要作為芯片處理器和STM32 外設(shè)的驅(qū)動時(shí)鐘,低速外部振蕩器用于驅(qū)動窗口看門狗和實(shí)時(shí)時(shí)鐘。該系統(tǒng)采用 8M外部晶振作為高速外部時(shí)鐘信號的時(shí)鐘源,外接兩個(gè)20p F的貼片電容。低速外部振蕩器</p><p>
10、 是時(shí)鐘源可以使用外部晶振或用戶自己提供,該系統(tǒng)采用頻率值為 32.768k Hz 的外部晶振,外接兩個(gè)10p F的貼片電容。STM32F030有3種啟動方式,分為系統(tǒng)復(fù)位、電源復(fù)位、備份區(qū)域復(fù)位。該系統(tǒng)采用電源復(fù)位,NRST 引腳與10K?電阻串聯(lián)使引腳處于高電位,當(dāng)需要復(fù)位時(shí),S1開關(guān)閉合使 NRST引腳接地,產(chǎn)生低電平使微處理器復(fù)位。該微處理器內(nèi)部也有復(fù)位電路,當(dāng)引腳電壓小于 2.0V,片會處于復(fù)位狀態(tài),但會有 40m A的延遲。
11、</p><p> 2.1.3 WIFI模塊</p><p> WIFI模塊的作用是實(shí)現(xiàn)下位機(jī)與上位機(jī)的實(shí)時(shí)通信,并且向上位機(jī)傳遞圖像數(shù)據(jù)。使用的是HC05模塊。其特性如下:</p><p> 1、嵌入高性能32位RISC微處理器 2、55nm CMOS 高度集成射頻技術(shù) 3、集成高性能開關(guān)穩(wěn)壓器 4、低功耗
12、 5、支持1/2/3/4/線 PTA WIFI/藍(lán)牙 6、自動校準(zhǔn) 7、天線分集 8、控制每個(gè)包的功率 9、完全遵守USB v 2.0 高速模式 10、直接支持WIFI功能 11、支持802.1w保護(hù)管理框架</p><p> 2.1.4 霍爾傳感器模塊</p><p> 霍爾傳感器是根
13、據(jù)霍爾效應(yīng)制作的一種磁場傳感器?;魻栃?yīng)是磁電效應(yīng)的一種,這一現(xiàn)象是霍爾(A.H.Hall,1855—1938)于1879年在研究金屬的導(dǎo)電機(jī)構(gòu)時(shí)發(fā)現(xiàn)的。后來發(fā)現(xiàn)半導(dǎo)體、導(dǎo)電流體等也有這種效應(yīng),而半導(dǎo)體的霍爾效應(yīng)比金屬強(qiáng)得多,利用這現(xiàn)象制成的各種霍爾元件,廣泛地應(yīng)用于工業(yè)自動化技術(shù)、檢測技術(shù)及信息處理等方面?;魻栃?yīng)是研究半導(dǎo)體材料性能的基本方法。通過霍爾效應(yīng)實(shí)驗(yàn)測定的霍爾系數(shù),能夠判斷半導(dǎo)體材料的導(dǎo)電類型、載流子濃度及載流子遷移率等重
14、要參數(shù)。</p><p> 由霍爾效應(yīng)的原理知,霍爾電勢的大小取決于:Rh為霍爾常數(shù),它與半導(dǎo)體材質(zhì)有關(guān);I為霍爾元件的偏置電流;B為磁場強(qiáng)度;d為半導(dǎo)體材料的厚度。</p><p> 對于一個(gè)給定的霍爾器件,當(dāng)偏置電流 I 固定時(shí),UH將完全取決于被測的磁場強(qiáng)度B。</p><p> 一個(gè)霍爾元件一般有四個(gè)引出端子,其中兩根是霍爾元件的偏置電流 I 的輸入端
15、,另兩根是霍爾電壓的輸出端。如果兩輸出端構(gòu)成外回路,就會產(chǎn)生霍爾電流。一般地說,偏置電流的設(shè)定通常由外部的基準(zhǔn)電壓源給出;若精度要求高,則基準(zhǔn)電壓源均用恒流源取代。為了達(dá)到高的靈敏度,有的霍爾元件的傳感面上裝有高導(dǎo)磁系數(shù)的鍍膜合金;這類傳感器的霍爾電勢較大,但在0.05T左右出現(xiàn)飽和,僅適用在低量限、小量程下使用。</p><p> 在半導(dǎo)體薄片兩端通以控制電流I,并在薄片的垂直方向施加磁感應(yīng)強(qiáng)度為B的勻強(qiáng)磁場
16、,則在垂直于電流和磁場的方向上,將產(chǎn)生電勢差為UH的霍爾電壓。</p><p><b> 圖2.2 霍爾效應(yīng)</b></p><p> 2.1.5 開關(guān)磁阻電機(jī)</p><p> 開關(guān)磁阻電動機(jī),調(diào)速系統(tǒng)所用的開關(guān)磁阻電動機(jī)(SRM)是SRD中實(shí)現(xiàn)機(jī)電能量轉(zhuǎn)換的部件,也是SRD有別于其他電動機(jī)驅(qū)動系統(tǒng)的主要標(biāo)志。SRM系雙凸極可變磁阻電動
17、機(jī),其定、轉(zhuǎn)子的凸極均由普通硅鋼片疊壓而成。轉(zhuǎn)子既無繞組也無永磁體,定子極上繞有集中繞組,徑向相對的兩個(gè)繞組聯(lián)接起來,稱為“一相”,SR電動機(jī)可以設(shè)計(jì)成多種不同相數(shù)結(jié)構(gòu),且定、轉(zhuǎn)子的極數(shù)有多種不同的搭配。相數(shù)多、步距角小,有利于減少轉(zhuǎn)矩脈動,但結(jié)構(gòu)復(fù)雜,且主開關(guān)器件多,成本高,現(xiàn)今應(yīng)用較多的是四相(8/6)結(jié)構(gòu)和三相(12/8)結(jié)構(gòu)。</p><p> 圖2.2示出四相(8/6)結(jié)構(gòu)SR電動機(jī)原理圖。為簡單計(jì),
18、圖中只畫出A相繞組及其供電電路。SR電動機(jī)的運(yùn)行原理遵循“磁阻最小原理”— ‘磁通總要沿著磁阻最小的路徑閉合,而具有一定形狀的鐵心在移動到最小磁阻位置時(shí),必使自己的主軸線與磁場的軸線重合。圖2中,當(dāng)定子D-D’極勵(lì)磁時(shí),1-1'向定子軸線D-D'重合的位置轉(zhuǎn)動,并使D相勵(lì)磁繞組的電感最大。若以圖中定、轉(zhuǎn)子所處的相對位置作為起始位置,則依次給D→A→B→C相繞組通電,轉(zhuǎn)子即會逆著勵(lì)磁順序以逆時(shí)針方向連續(xù)旋轉(zhuǎn);反之,若依次給
19、B→A→D→C相通電,則電動機(jī)即會沿順時(shí)針方向轉(zhuǎn)動。可見,SR電動機(jī)的轉(zhuǎn)向與相繞組的電流方向無關(guān),而僅取決于相繞組通電的順序。另外,從圖2.2可以看出,當(dāng)主開關(guān)器件S1、S2導(dǎo)通時(shí),A相繞組從直流電源US吸收電能,而當(dāng)S1、S2關(guān)斷時(shí),繞組電流經(jīng)續(xù)流二極管VD1、VD2繼續(xù)流通,并回饋給電源US。因此,SR電動機(jī)傳動的共性特點(diǎn)是具有再生作用,系統(tǒng)效率高。</p><p><b> 圖 2.3</
20、b></p><p> 2.1.6 電路板抗干擾設(shè)計(jì)</p><p> 電路設(shè)計(jì)和應(yīng)用應(yīng)盡量消除或抑制電子電路的干擾,該監(jiān)測系統(tǒng)的硬件電路用來接收傳感器的數(shù)據(jù)并對其進(jìn)行處理,如果不能降低各類干擾的影響,將會增加監(jiān)測數(shù)據(jù)誤差。硬件電路設(shè)計(jì)過程中充分考慮對干擾的抑制,對電路進(jìn)行了合理的設(shè)計(jì)以及選擇合適的元器件。</p><p> 在硬件電路設(shè)計(jì)過程中,充
21、分從抑制干擾源、切斷干擾途徑以及提高元器件的抗干擾性能等三方面考慮,為降低信號干擾,采取了以下措施。</p><p> ?。?)以核心部件為中心,圍繞其進(jìn)行布線,易受干擾元器件相互遠(yuǎn)離,輸入輸出元器件分開放置,電源和高頻電路部分盡量遠(yuǎn)離;</p><p> (2)STM32微處理器和大功率器件的地線需要單獨(dú)接地,以減少相互干擾,大功率元器件放置在電路板邊緣;</p><
22、;p> ?。?)在電路板布線時(shí)避免九十度折線,同時(shí)減少回路環(huán)面積,選擇合適粗細(xì)的地線以及電源線;</p><p> ?。?)數(shù)字區(qū)和模擬區(qū)用地線隔離,模擬地和數(shù)字地要分離,統(tǒng)一在一點(diǎn)接于電源地。</p><p><b> 軟件設(shè)計(jì)方案</b></p><p><b> 軟件系統(tǒng)框圖如下:</b></p>
23、;<p> 軟件系統(tǒng)框圖 2.4</p><p> 手機(jī)客戶端APP設(shè)計(jì)</p><p><b> 開發(fā)環(huán)境的搭建</b></p><p> 本設(shè)計(jì)在開發(fā)過程中使用Eclipse加ADT插件的開發(fā)環(huán)境,Eclipse集成開發(fā)環(huán)境JDK,首先需要安裝JDK工具包,本設(shè)計(jì)中使用的JDK版本是JDK-7-Windows-i586
24、.exe。安裝完成后,配置系統(tǒng)環(huán)境變量,將JDK的安裝路徑添加到系統(tǒng)Path中去。在Andriod developer官網(wǎng)上下載Eclipse開發(fā)環(huán)境,其己對Eclipse和ADK插件綁定,開發(fā)者直接下載后解壓即可使用。本設(shè)計(jì)使用的ADT版本是adt-bundle-windows-x86-20140702.zip。</p><p> 手機(jī)APP的主要功能模塊</p><p>
25、 手機(jī)APP的設(shè)計(jì)采用了MVC框架,將Model、View和Controler分開,有效減少開發(fā)工作量量和有效減少開發(fā)工作查和代碼冗余率,有利于代碼調(diào)試。本設(shè)計(jì)將手機(jī)端功能主要分為5大功能模塊:登錄功能模塊、查詢功能模塊、接收數(shù)據(jù)模塊、藍(lán)牙驗(yàn)證模塊。</p><p><b> ?。?)登錄模塊</b></p><p> 登錄模塊需要用戶輸入個(gè)人信息,如用戶名、密碼
26、、手機(jī)號碼等。登錄界面設(shè)計(jì)兩個(gè)EditView輸入爛和2個(gè)Button,輸入爛用來接收用戶名,2個(gè)按紐分別是登錄和取消。當(dāng)用戶點(diǎn)擊確認(rèn)按鈕后,跳轉(zhuǎn)到主頁面。</p><p> confirm=(ImageButton)findViewById(R.id.confirm);(確認(rèn)按鈕綁定)</p><p> cancel=(ImageButton)findViewById(R.id.ca
27、ncel); (取消按鈕綁定)</p><p> public void onClick(View v) { (設(shè)定按鈕點(diǎn)擊事件)</p><p> switch (v.getId()) {</p><p> case R.id.confirm:</p><p> username=name.get
28、Text().toString();</p><p> if(username.equals(""))</p><p><b> {</b></p><p> Toast.makeText(LoginActivity.this, "用戶名為空,請輸入!", Toast.LENGTH_SHORT).s
29、how();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Intent intent = new Intent();</p><p> intent.
30、setClass(LoginActivity.this, MainActivity.class);</p><p> intent.putExtra("name", username); </p><p> startActivity(intent);</p><p><b> }</b></p>
31、;<p><b> break;</b></p><p> case R.id.cancel:</p><p> this.finish();</p><p><b> break;</b></p><p><b> default:</b></p
32、><p><b> break;</b></p><p><b> }</b></p><p><b> ?。?)藍(lán)牙搜索模塊</b></p><p> 進(jìn)入搜索藍(lán)牙界面后,會搜索附近的藍(lán)牙</p><p> a.設(shè)置權(quán)限 在manife
33、st中配置 </p><p> <uses-permission android:name="android.permission.BLUETOOTH"/> </p><p> <uses-permission android:name="android.permission.BLUET
34、OOTH_ADMIN"/>b.啟動藍(lán)牙 首先要查看本機(jī)是否支持藍(lán)牙,獲取BluetoothAdapter藍(lán)牙適配器對象 </p><p> BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); </p><
35、p> if(mBluetoothAdapter == null){ //表明此手機(jī)不支持藍(lán)牙 </p><p><b> return; </b></p><p><b> } </b></p><p> i
36、f(!mBluetoothAdapter.isEnabled()){ //藍(lán)牙未開啟,則開啟藍(lán)牙 </p><p> Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); </p><p> star
37、tActivityForResult(enableIntent, REQUEST_ENABLE_BT); </p><p><b> } </b></p><p> public void onActivityResult(int requestCode, i
38、nt resultCode, Intent data){ </p><p> if(requestCode == REQUEST_ENABLE_BT){ </p><p> if(requestCode == RESULT_OK){ //藍(lán)牙已經(jīng)開啟 &
39、#160; </p><p><b> } </b></p><p><b> } </b></p><p> } c.發(fā)現(xiàn)藍(lán)牙設(shè)備 這里可以細(xì)分為幾個(gè)方面 (I)使本機(jī)藍(lán)牙處于可見(即處于易被搜索到狀態(tài)),便
40、于其他設(shè)備發(fā)現(xiàn)本機(jī)藍(lán)牙 </p><p> //使本機(jī)藍(lán)牙在300秒內(nèi)可被搜索 </p><p> private void ensureDiscoverable() { </p><p> if (mBluetoothAdapter.getScanMode()
41、60;!= </p><p> BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { </p><p> Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQ
42、UEST_DISCOVERABLE); </p><p> discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); </p><p> startActivity(discoverableIntent); &
43、lt;/p><p><b> } </b></p><p> } (II)查找已經(jīng)配對的藍(lán)牙設(shè)備,即以前已經(jīng)配對過的設(shè)備 </p><p> Set<BluetoothDevice> pairedDevices = mBluetoothAdapt
44、er.getBondedDevices(); </p><p> if (pairedDevices.size() > 0) { </p><p> findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
45、 for (BluetoothDevice device : pairedDevices) { </p><p> //device.getName() +" "+ device.getAddress()); </p><p><
46、b> } </b></p><p> } else { </p><p> mPairedDevicesArrayAdapter.add("沒有找到已匹對的設(shè)備"); </p><p><b> } &l
47、t;/b></p><p> (III)通過mBluetoothAdapter.startDiscovery();搜索設(shè)備,要獲得此搜索的結(jié)果需要注冊 一個(gè)BroadcastReceiver來獲取。先注冊再獲取信息,然后處理</p><p> //注冊,當(dāng)一個(gè)設(shè)備被發(fā)現(xiàn)時(shí)調(diào)用onReceive</p><p> IntentFilter
48、0;filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);</p><p> this.registerReceiver(mReceiver, filter);</p><p> //當(dāng)搜索結(jié)束后調(diào)用onReceive</p><p> filter =
49、 new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); </p><p> this.registerReceiver(mReceiver, filter); </p><p> private BroadcastReceiver
50、160;mReceiver = new BroadcastReceiver() {@Override </p><p> public void onReceive(Context context, Intent intent) { </p><p&
51、gt; String action = intent.getAction(); </p><p> if(BluetoothDevice.ACTION_FOUND.equals(action)){ </p><p> BluetoothDevice device = intent.
52、getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 已經(jīng)配對的則跳過 </p><p> if (device.getBondState() != BluetoothDevice.BOND_BONDED) {</p><p> mNewDe
53、vicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); //保存設(shè)備地址與名字 </p><p><b> } </b></p><p> }else
54、60;if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { //搜索結(jié)束 </p><p> if (mNewDevicesArrayAdapter.getCount() == 0) </p><p&g
55、t; mNewDevicesArrayAdapter.add("沒有搜索到設(shè)備"); </p><p><b> } </b></p><p><b> } </b></p><p><b> }
56、</b></p><p> }; d.建立連接 查找到設(shè)備 后,則需要建立本機(jī)與其他設(shè)備之間的連接。一般用本機(jī)搜索其他藍(lán)牙設(shè)備時(shí),本機(jī)可以作為一個(gè)服務(wù)端,接收其他設(shè)備的連接。啟動一個(gè)服務(wù)器端的線程,死循環(huán)等待客戶端的連接,這與ServerSocket極為相似。 這個(gè)線程在準(zhǔn)備連接之前啟動 </p><p> //UU
57、ID可以看做一個(gè)端口號 </p><p> private static final UUID MY_UUID = </p><p> UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"); &
58、lt;/p><p> //像一個(gè)服務(wù)器一樣時(shí)刻監(jiān)聽是否有連接建立 </p><p> private class AcceptThread extends Thread{ </p><p> private BluetoothServerSocket serve
59、rSocket; </p><p> public AcceptThread(boolean secure){ </p><p> BluetoothServerSocket temp = null; </p><p
60、><b> try { </b></p><p> temp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord( </p><p> NAME_INSECURE, MY_UUID); </p>
61、<p> } catch (IOException e) { </p><p> Log.e("app", "listen() failed", e); </p><p><b> }
62、</b></p><p> serverSocket = temp; </p><p><b> } </b></p><p> public void run(){ </p><
63、;p> BluetoothSocket socket=null; </p><p> while(true){ </p><p><b> try { </b></p><p> socket = serverSocket.a
64、ccept(); </p><p> } catch (IOException e) { </p><p> Log.e("app", "accept() failed", e); </p><
65、;p><b> break; </b></p><p><b> } </b></p><p><b> } </b></p><p> if(socket!=null){ //此時(shí)可以新建一個(gè)數(shù)據(jù)交換線程,把此
66、socket傳進(jìn)去 </p><p><b> } </b></p><p><b> } </b></p><p><b> //取消監(jiān)聽 </b></p><p
67、> public void cancel(){ </p><p><b> try { </b></p><p> serverSocket.close(); </p><p> } cat
68、ch (IOException e) { </p><p> Log.e("app", "Socket Type" + socketType + "close() of server failed",
69、e); </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> e.建立數(shù)據(jù)通信線程,進(jìn)行讀取數(shù)據(jù)
70、 </p><p> //建立連接后,進(jìn)行數(shù)據(jù)通信的線程 </p><p> private class ConnectedThread extends Thread{ </p><p> private BluetoothSocket socke
71、t; </p><p> private InputStream inStream; </p><p> private OutputStream outStream; </p&g
72、t;<p> public ConnectedThread(BluetoothSocket socket){ </p><p> this.socket = socket; </p><p> try { //獲得輸入輸出流
73、0; </p><p> inStream = socket.getInputStream(); </p><p> outStream = socket.getOutputStream(); </p><p> } catch (IOExcept
74、ion e) { </p><p> Log.e("app", "temp sockets not created", e); </p><p><b> } </b></p>
75、<p><b> } </b></p><p> public void run(){ </p><p> byte[] buff = new byte[1024]; </p>
76、<p> int len=0;//讀數(shù)據(jù)需不斷監(jiān)聽,寫不需要 </p><p> while(true){ </p><p><b> try { </b></p><p> len = inStream.read(bu
77、ff); </p><p> //把讀取到的數(shù)據(jù)發(fā)送給UI進(jìn)行顯示 </p><p> Message msg = handler.obtainMessage(BluetoothChat.MESSAGE_READ,len, -1, buff); </p>&
78、lt;p> msg.sendToTarget(); </p><p> } catch (IOException e) { </p><p> Log.e("app", "disconnected", e); &l
79、t;/p><p> connectionLost(); //失去連接 </p><p> start(); //重新啟動服務(wù)器 </p><p><b> break; </b></p>
80、<p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> public void write(byte[] bu
81、ffer) { </p><p><b> try { </b></p><p> outStream.write(buffer); </p><p> // Share the sent message
82、;back to the UI Activity </p><p> handler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer).sendToTarget(); </p><p> } ca
83、tch (IOException e) { </p><p> Log.e("app", "Exception during write", e); </p><p><b> } </b>
84、</p><p><b> } </b></p><p> public void cancel() { </p><p><b> try { </b></p><p> socket
85、.close(); </p><p> } catch (IOException e) { </p><p> Log.e("app", "close() of connect socket failed",
86、60;e);</p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p><b> ?。?)數(shù)據(jù)查詢</b>
87、</p><p> query=(ImageButton)findViewById(R.id.query);</p><p> query.setOnClickListener(this);</p><p> listview = (ListView) findViewById(R.id.listView);</p><p> db=
88、new DataBaseCreat(MainActivity.this);</p><p> db.open(); </p><p> begin_date=(EditText)findViewById(R.id.begin_date);</p><p> end_date=(EditText)findViewById(R.id.end_date);</
89、p><p> yue=(Button)findViewById(R.id.yue);</p><p> zhou=(Button)findViewById(R.id.zhou);</p><p> ri=(Button)findViewById(R.id.ri);</p><p> yue.setOnClickListener(new O
90、nClickListener() {</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // TODO Auto-generated method stub</p><p> QUERY_METHOD=0;<
91、/p><p><b> }</b></p><p><b> });</b></p><p> zhou.setOnClickListener(new OnClickListener() {</p><p><b> @Override</b></p><
92、;p> public void onClick(View v) {</p><p> // TODO Auto-generated method stub</p><p> QUERY_METHOD=1;</p><p><b> }</b></p><p><b> });</b>
93、</p><p> ri.setOnClickListener(new OnClickListener() {</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // TODO Auto-generated met
94、hod stub</p><p> QUERY_METHOD=2;</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p><b> @Override&l
95、t;/b></p><p> public void onClick(View v) {</p><p> // TODO Auto-generated method stub</p><p> switch (v.getId()) {</p><p> case R.id.query:</p><p>
96、 if(TextUtils.isEmpty(begin_date.getText()) || TextUtils.isEmpty(end_date.getText()))</p><p><b> {</b></p><p> Toast.makeText(MainActivity.this, "輸入時(shí)間為空,請檢查", Toast.LENG
97、TH_SHORT).show();</p><p><b> break;</b></p><p><b> }</b></p><p> Toast.makeText(MainActivity.this, "查詢中,請稍后", Toast.LENGTH_SHORT).show();</p&
98、gt;<p> ArrayList<HashMap<String, Object>> temp = new ArrayList<HashMap<String,Object>>();</p><p> temp=db.getAllContact(QUERY_METHOD,name,datebegin, dateend);</p><
99、;p> SimpleAdapter myAdapter = null;</p><p> switch (QUERY_METHOD) {</p><p><b> case 0:</b></p><p> myAdapter = new SimpleAdapter(this,temp,R.layout.item0,</p&g
100、t;<p> new String[]{"user_name","year", "month","total"},</p><p> new int[] {R.id.user_name0,R.id.year0,R.id.month0,R.id.total0} </p><p><b&g
101、t; );</b></p><p><b> break;</b></p><p><b> case 1:</b></p><p> myAdapter = new SimpleAdapter(this,temp,R.layout.item1,</p><p> new St
102、ring[]{"user_name","weekofyear","total"},</p><p> new int[] {R.id.user_name1,R.id.weekofyear1,R.id.total1} </p><p><b> );</b></p><p><
103、;b> break;</b></p><p><b> case 2:</b></p><p> myAdapter = new SimpleAdapter(this,temp,R.layout.item2,</p><p> new String[]{"user_name","year&
104、quot;, "month","day","total"},</p><p> new int[] {R.id.user_name2,R.id.year2,R.id.month2,R.id.day2,R.id.total2} </p><p><b> );</b></p><p&g
105、t;<b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p> listview.setAdapter(myAdapt
106、er);</p><p><b> Break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b&
107、gt; }</b></p><p> 軟件件調(diào)試過程和結(jié)果</p><p> 由于我只負(fù)責(zé)軟件部分,硬件部分由終端同學(xué)負(fù)責(zé),需要將PCB板打出來,這里我們用電腦模仿硬件,用串口調(diào)試助手通過藍(lán)牙向外發(fā)送數(shù)據(jù),然后手機(jī)APP端接收,并通過查詢按鈕查詢出來并實(shí)時(shí)顯示電流數(shù)據(jù),電壓數(shù)據(jù),轉(zhuǎn)速數(shù)據(jù)和總電量,下面是我們的測試示意圖:</p><p><b
108、> 藍(lán)牙搜索界面:</b></p><p><b> 接收數(shù)據(jù)顯示界面:</b></p><p><b> 按天查詢界面:</b></p><p><b> 按周查詢:</b></p><p><b> 按月查詢:</b><
109、;/p><p> 測試結(jié)果表明,各功能均能正常實(shí)現(xiàn)。</p><p><b> 課程總結(jié)</b></p><p> 本學(xué)期為期一周的嵌入式課程設(shè)計(jì)在不知不覺中結(jié)束了,雖說這次課程設(shè)計(jì)時(shí)間不是很長,但是感覺自己收獲頗豐,不僅學(xué)習(xí)到了一些新知識,回顧了以前的一些快要遺忘的知識點(diǎn),而且使自己的學(xué)習(xí)目標(biāo)更加明確,學(xué)習(xí)方法更加完善,也體會到軟件開發(fā)的趣
110、味,更加清楚地認(rèn)識到了自己在軟件開發(fā)及學(xué)習(xí)上的一些不足之處。</p><p> 感謝這個(gè)互聯(lián)網(wǎng)發(fā)達(dá)的時(shí)代,在網(wǎng)上基本都能找到自己想要的資料,在設(shè)計(jì)開發(fā)過程中遇到很多問題,首先就是安卓開發(fā)軟件的熟悉和java語言的學(xué)習(xí),這個(gè)過程,我用了大概兩周的時(shí)間,在上網(wǎng)查閱相關(guān)資料和請教師兄的情況下,基本做到了具有實(shí)現(xiàn)基本開發(fā)的能力,然后就是藍(lán)牙通信的問題,這個(gè)問題也困擾了好長時(shí)間,因?yàn)槲抑皼]有接觸過這方面的東西,所有就問
111、了周圍的師兄,最終在師兄的指導(dǎo)下完成了藍(lán)牙通信,剩下的問題就是軟件功能的開發(fā)了,這個(gè)是主要工作量,我大部分都是通過上網(wǎng)找資料,花了大量的時(shí)間,最終設(shè)計(jì)出符合要求的軟件,值得一提的是中間數(shù)據(jù)存儲也花了不少時(shí)間,數(shù)據(jù)庫的建立并不容易,數(shù)據(jù)的查詢其實(shí)是主要問題,這個(gè)問題的解決最終標(biāo)志著我完成了最后的任務(wù)。</p><p> 此次實(shí)訓(xùn)最大的收獲不是我學(xué)習(xí)到了多少知識而是這幾天實(shí)訓(xùn)給我的感悟:首先是心態(tài)。一定要有一個(gè)積極
112、的心態(tài),獨(dú)立解決問題的意識,培養(yǎng)扎實(shí)基礎(chǔ)的認(rèn)識。不要什么東西都感覺跟簡單(很多東西可能是看似簡單)就不去做了或者不屑一做,以至于性網(wǎng)上搜搜就可以了,這樣很不好。有自己的東西有自己的付出才會有程序運(yùn)行成功時(shí)的喜悅和小自豪,這樣也有助于培養(yǎng)自己的興趣。要時(shí)刻牢記態(tài)度決定一切。其次是興趣,感覺學(xué)習(xí)工作中興趣很關(guān)鍵,只是一個(gè)引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序調(diào)
113、試的過程中這點(diǎn)尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個(gè)積累經(jīng)驗(yàn)的過程,而且很高效。最后要不懈追求。對于源代碼進(jìn)行不斷的完善,要盡可能的實(shí)現(xiàn)課題所要求的功能。對于初學(xué)者或者開發(fā)較少的人來說,大量大寫程序還是有必要的,但同時(shí)要注意思考,理解其實(shí)現(xiàn)的內(nèi)在意義。還可以自己添加一些有意義的功能來實(shí)現(xiàn)。當(dāng)看到自己編寫的程序正常運(yùn)行時(shí),興趣也會隨之而來,樂此不疲,形成一個(gè)良性循環(huán)。</p><p> 短短一學(xué)期的實(shí)訓(xùn)課很快
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式語音-數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì).pdf
- 嵌入式GPRS無線數(shù)據(jù)傳輸系統(tǒng)實(shí)現(xiàn)及應(yīng)用.pdf
- 基于無線數(shù)據(jù)傳輸?shù)那度胧奖O(jiān)控系統(tǒng)的研究.pdf
- 基于嵌入式系統(tǒng)的無線數(shù)據(jù)傳輸終端研究與設(shè)計(jì).pdf
- 基于SOPC的嵌入式數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì).pdf
- 基于CPCI架構(gòu)的嵌入式數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì).pdf
- 嵌入式醫(yī)療數(shù)據(jù)傳輸技術(shù)的研究.pdf
- 基于Linux的WFT嵌入式數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì).pdf
- 基于藍(lán)牙的WFT無線數(shù)據(jù)傳輸裝置設(shè)計(jì).pdf
- 基于ARM嵌入式系統(tǒng)的腦電數(shù)據(jù)傳輸.pdf
- 基于ARM平臺嵌入式數(shù)據(jù)傳輸通信軟件的設(shè)計(jì).pdf
- 聲納嵌入式高速數(shù)據(jù)傳輸技術(shù)及其實(shí)現(xiàn).pdf
- 基于嵌入式soc的高速數(shù)據(jù)傳輸系統(tǒng)的研究
- 基于GPRS嵌入式數(shù)據(jù)傳輸系統(tǒng)的研究與開發(fā).pdf
- 基于GPRS的嵌入式數(shù)據(jù)傳輸終端的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于SOPC的嵌入式網(wǎng)絡(luò)數(shù)據(jù)傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于嵌入式SOC的高速數(shù)據(jù)傳輸系統(tǒng)的研究.pdf
- 無線數(shù)據(jù)傳輸?shù)慕M網(wǎng)設(shè)計(jì).pdf
- 基于嵌入式技術(shù)的衛(wèi)星數(shù)據(jù)接收系統(tǒng)的監(jiān)控及數(shù)據(jù)傳輸.pdf
- 開題報(bào)告--gprs無線數(shù)據(jù)傳輸模塊設(shè)計(jì)
評論
0/150
提交評論