




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一 第二 iDuino硬件解 iDuino設(shè)計(jì)理 iDuino框架 系統(tǒng)復(fù)位及USB轉(zhuǎn) 外 第三 第四 常 新 oWorld程 第五 iDuino輸入輸出的使 iDuinoPCINT的處 第六 第七 iDuinoI2C通信應(yīng) I2C主設(shè)備讀過 I2C主設(shè)備寫過 I2C從設(shè)備讀過 I2C從設(shè)備寫過 iDuinoI2C的雙向通 iDuino模擬I2C的使 iDuino使用I2C設(shè) 第八 iDuinoSPI通信應(yīng) iDuinoSPI函數(shù)工作原 iDuino模擬SPI的使 iDuino使用SPI設(shè)備-TF卡的使 iDuinoSD庫(kù)的移 iDuinoSD庫(kù)的使 第九 iDuino單總線協(xié)議及私有協(xié)議通信應(yīng) 第十 iDuino無線通信應(yīng) iDuino無線通信高級(jí)應(yīng) iDuino以太網(wǎng)通信應(yīng) 基于UIP的UDP程序設(shè) 基于UIP的TCP客戶端程序設(shè) 基于UIP的TCP服務(wù)端程序設(shè) 基于PSOCK的TCP程序設(shè) 基于UIP的WEB客戶端使 基于UIP的WEB服務(wù)器使 iDuino低功耗程序設(shè) BMesh內(nèi)部實(shí) BMesh數(shù)據(jù)包格 BMesh節(jié)點(diǎn)鄰居列表 BMesh節(jié)點(diǎn)發(fā)現(xiàn)的優(yōu) BMesh可靠數(shù)據(jù)上報(bào)的實(shí) BMesh輪詢方式數(shù)據(jù)獲取的實(shí) Process Timer 第一章物聯(lián)網(wǎng)及無線傳感器網(wǎng)絡(luò)概述物聯(lián)網(wǎng)有機(jī)會(huì)獲取更大的商業(yè)利益。那對(duì)這樣的一個(gè)“物聯(lián)網(wǎng)”狂潮,我們作為一個(gè)普通的技其實(shí),對(duì)于技術(shù)人員來說,物聯(lián)網(wǎng)技術(shù)并不是一門新的技術(shù),而是以前眾多的這有兩層意思:第一,物聯(lián)網(wǎng)的和基礎(chǔ)仍然是互聯(lián)網(wǎng),它是在互聯(lián)網(wǎng)基礎(chǔ)上通過延伸和和通信。當(dāng)前,物聯(lián)網(wǎng)比較正式的定義是:通過射頻識(shí)別、紅外感應(yīng)器、全球、激信,以實(shí)現(xiàn)對(duì)物體的智能化識(shí)別、定位、、和管理的一種網(wǎng)絡(luò)。 技術(shù)組成,它們分別是RFID無線射頻識(shí)別技術(shù)、CloudComputing云計(jì)算技術(shù)和WSN無線傳感網(wǎng)技術(shù),也就是說,只有我們從事了這 RFID技術(shù)相對(duì)成熟,行業(yè)的競(jìng)爭(zhēng)主要就是價(jià)格和企業(yè)規(guī)模的競(jìng)爭(zhēng);CloudComputing技術(shù)相對(duì)復(fù)雜,而且投資巨大,遠(yuǎn)遠(yuǎn)超過一般小團(tuán)隊(duì)技術(shù)人員的WSN技術(shù)則相對(duì)簡(jiǎn)單,同時(shí)在實(shí)現(xiàn)上也沒有標(biāo)準(zhǔn)化,是技術(shù)人員進(jìn)入物聯(lián)網(wǎng)WSN無線傳感器網(wǎng)絡(luò),,技術(shù)人員的價(jià)值才無線傳感器網(wǎng)絡(luò)
移動(dòng)終終網(wǎng)電腦終無線傳感器網(wǎng)絡(luò)操作系統(tǒng) 統(tǒng)和我們?nèi)粘K褂玫牟僮飨到y(tǒng)有很大的區(qū)別。對(duì)于我們?nèi)粘J褂玫腤indows或Linux操載到單片機(jī)中,所以單片機(jī)操作系統(tǒng)和我們的應(yīng)用程序關(guān)系密切,須慎重選擇。操作系統(tǒng)的使用情況,推薦使用如下(以2013.8.7為參考日期:是最早WSNAVR,MSP430,是WSN操作系A(chǔ)VR,MSP430,Xscale,Cortex-M3C功能強(qiáng)大是最方便的開發(fā)不帶WSN功能也沒有-1ContikiArduinoContiki來說,由于支持ArduinoC++開發(fā),而且第的擴(kuò)需要注意的是,Arduino在不同的語(yǔ)境中代表著不同的含義,首先它可能代表的是一款I(lǐng)DE及arduino庫(kù)),也有可能代表著單獨(dú)的arduino板、arduinoIDE環(huán)境和arduino核心庫(kù)。考慮到本書并不使用的arduino板和arduinoIDE開發(fā)環(huán)境,而是采中自行修正的硬件平臺(tái)和軟件開發(fā)環(huán)境,所以本書后面出現(xiàn)的arduino代表的是arduino Arduino庫(kù)對(duì)于初學(xué)者,尤其是從計(jì)算機(jī)編程轉(zhuǎn)到嵌入式編程的學(xué)習(xí)者來說具有重javac#一樣來操作單片機(jī),既不用了解復(fù)雜的單片機(jī)寄存c語(yǔ)言指針。利用Arduino庫(kù)進(jìn)行單片機(jī)開發(fā)的主要優(yōu)點(diǎn)如AVR平臺(tái)無關(guān)性。ArduinoAVRMCU的差異,通過統(tǒng)一MCU的實(shí)現(xiàn)方便使用的硬件抽象層。ArduinoAVR實(shí)現(xiàn)了完美的硬件抽象層,包括UART,I2C,SPI,,ADC,Timer等,用戶可以在完全不了解寄存器的情況下使用AVRMCU。使用面向?qū)ο蟮某绦蛟O(shè)計(jì)。ArduinoC++C豐富的第函數(shù)庫(kù)和項(xiàng)目庫(kù)。Arduino因?yàn)槠滠浻布块_源的特點(diǎn),在加上其它提供的只是函數(shù),所以我們可以在其它操作系統(tǒng)中使用Arduino庫(kù),當(dāng)然,前提是支持C++編譯器。-2Arduino無線傳感器網(wǎng)絡(luò)硬件節(jié)點(diǎn)件(傳感器、能量組件(電池等)和通訊組件(射頻)四部分內(nèi)容,其中的是微處理器和射頻。過網(wǎng)頁(yè): ofwirelesssensornodes查看當(dāng)前主要可用的無線傳感器網(wǎng)絡(luò)節(jié)點(diǎn)列表以及其主要參數(shù)。這些節(jié)點(diǎn)幾乎涵蓋了所有的MCU架構(gòu)和射頻收發(fā),其中在國(guó)內(nèi)比較有的有Iris,Micaz,Imote2等,如果不打算自己做無線節(jié)點(diǎn) 高,F(xiàn)LASH和RAM大, iDuinoAtmega128RFA1SOC射頻處理,另外還加第二章iDuino硬件解讀iDuinoNano-Rk、BitCloudZigbee等多個(gè)操作系統(tǒng),而且網(wǎng)上資料豐富,學(xué)習(xí)起來非常方Arduino硬件接口兼容。Arduino的成功生態(tài)帶來了大量的Arduino兼容擴(kuò)展樣式,方便用戶的自由擴(kuò)展。當(dāng)然,我們也發(fā)現(xiàn)了Arduino開發(fā)板的單排擴(kuò)展插針然和的Arduino開發(fā)板保持兼容。-1iDuinoiDuinoAVR802.15.4無線收發(fā)功能以外,還增加了以下 滿足唯一地址編碼要求的MACSOC微處理器SOC微處理器-2.4GAT86RF212無線最大發(fā)射功率-779-787863-870902-928選ENC28J60以太網(wǎng)DS241148器用作MAC址SI3402POE理IEEE表格二-1iDuino主 iDuino下圖是iDuino開發(fā)板的整體結(jié)構(gòu),由電源管理模塊,微處理器及射頻模塊,系統(tǒng)復(fù)位及USB轉(zhuǎn)UART模塊、以太網(wǎng)模塊、外 -2iDuinoSPIAT86RF212射頻模塊、ENC28J60SD外部模塊之間進(jìn)行通訊,并根據(jù)片選的不同確定當(dāng)前SPI通訊的具體對(duì)象。下面是POE做成了擴(kuò)展模塊的方式提供用戶選擇性。POE模塊采用方式設(shè)計(jì),支持用戶在使用POE的情況下接入有源設(shè)備,它的輸出是標(biāo)準(zhǔn)的5V,最大電流2A。可能對(duì)電腦造成損壞,所以這里加入了500mA的自恢復(fù)絲,具體原理圖如下:-3USBPOEP15VLDO3.3V5號(hào)電池的電源選擇也是一個(gè)二選一,它是通過一個(gè)比較器(LM358D)PPOEUSB二選一的V5VLDO3.3V5號(hào)電池都可以單獨(dú)的成為供電來源,而5VP溝道場(chǎng)效應(yīng)管關(guān)閉從而切斷電池的供電通路,5VVCCUSB或POE充電的情況。當(dāng)只有電池時(shí),VBAT將成為VCC。-4LDOLDOTITPS736335V3.3V。它輸入輸出端的濾波電的USB口供電以保證有充足的電流。2*8UTP的兩個(gè)空閑腳和網(wǎng)絡(luò)連接器的變壓器的兩802.3at(POE+SI3402這款開關(guān)頻率在350Khz,參考設(shè)計(jì)方案有和非兩種設(shè)計(jì)。所謂的計(jì)的應(yīng)用場(chǎng)景為無線AP、IP和IP頭這種獨(dú)立系統(tǒng)。考慮到本系統(tǒng)的POE模塊的應(yīng)6POE在反激開關(guān)穩(wěn)壓設(shè)計(jì)(式設(shè)計(jì)的一種)中,的器件是反激式變壓器T2和光耦U1SI3402FET打開時(shí),變壓器原級(jí)導(dǎo)通,線圈儲(chǔ)能,同名端打點(diǎn)處為負(fù)極,負(fù)級(jí)D3C5FET斷開時(shí),原級(jí)截止,D31:0.4FET80VPD55VD2片電容和L1(D01608-102ML,1uH)PI型濾波電路濾除電流波紋。輸入端還R6構(gòu)成分壓電路,R8C9為環(huán)路提供補(bǔ)償,U4為電壓基準(zhǔn)(TLV4311.24VREF,輸出電=1.24(1+R5/R6(EROUT)補(bǔ)償輸入電流的變化,促使片內(nèi)對(duì)比較器進(jìn)行調(diào)節(jié),改變占空比,達(dá)到-5POEPCB PSE端是在PD端低輸入交流阻抗(輸入電容大5uF)PD帶至250mWSI3402ESR的陶瓷也通過并入多個(gè)陶瓷貼片電容(C1、C3、C4)ESR避免了大電流波紋,提高濾波的效果,但電解電容容值也不易過大,否則會(huì)延長(zhǎng)PSE端對(duì)PD的反應(yīng)時(shí)間。并且需要在SI3402250mW5V電壓,所以使用的是100歐姆的防空載電阻。-6POE微處理器及射頻-7780M頻段AT86RF212射頻,它們之間通過SPI方式連接,滿足用戶多種頻段射頻2.4G780M的射頻輸出都通過BALUN100OhmRF50Ohm信號(hào),-7780M頻段AT86RF212射頻,它們之間通過SPI方式連接,滿足用戶多種頻段射頻2.4G780M的射頻輸出都通過BALUN100OhmRF50Ohm信號(hào),BALUNJOHANSON的帶濾波器功能的平衡非平衡轉(zhuǎn)換器,最后通過SMA/MMC座連接帶增益天線。iDuinoDS2411ROMiDuino48BITMACNetwork的速度和總線負(fù)載加入0.3K-2.2K之間的一個(gè)上拉電阻。-8DS2411 -9PCBiDuino1.6mmFR4PCB設(shè)計(jì),上下電路板銅厚35uM-10iDuinoPCBlayout射頻差分RFBALUN輸入引腳之間的走線需要足夠小的電導(dǎo)值。參考的電1.2nH1.5mmFR4100歐姆的阻抗差分線,根據(jù)微帶線計(jì)算,算出的線寬為0.2mm(約8miL。走線的方式為差分對(duì)稱方式。BALUN的使用需要有效的接地。BALUN的輸出是單端的波導(dǎo),微波信號(hào)在波導(dǎo)線和地BALUN的濾波性能。使用的辦法是盡BALUN的周ATMEGA128RFA1的模擬地引腳需要與背面的地焊盤連接。連線的寬度盡量不要寬 -11iDuinoRESET復(fù)位鍵,支持用戶的手動(dòng)復(fù)位,為了方便調(diào)試輸出,iDuino單片機(jī)的UART通過Silabs的CP2104串口轉(zhuǎn)換轉(zhuǎn)換成USB接口實(shí)現(xiàn)與電腦的通訊。USBiDuino上的開發(fā)更加方便快捷。硬件上需要上位CP2104IOCP2104DCDIO口并通過一個(gè)電容做積分處理接到單片機(jī)的復(fù)位引腳上,IO-122.7 與MCU交互。-1324BOB-SMITHEMC處理。由于iDuino使用的用于的網(wǎng)絡(luò)變壓器集成在網(wǎng)絡(luò)連接器中,網(wǎng)絡(luò)連接器本系統(tǒng)使用的是帶共模電感的RJ45網(wǎng)絡(luò)變壓器,它支持POE供電擴(kuò)展。由于ENC28J60-ISO這款以太網(wǎng)接口1.2mAiDuinoIOPMOS管作為它的電源開關(guān)的機(jī)制。上電初始情2.8在外部方面,iDuino板載TF,支持用戶通過SPI方式進(jìn)行數(shù)據(jù)。在電路來管理TF卡的供電。該功耗控制電路圖部分可以參考以太網(wǎng)接口的電源管理。IOArduino的物理封裝和線序定D1、D2、D3、D4pinpin腳定義或者編上了編號(hào)(板上白色絲印可見。PortPin號(hào)、Pin腳編號(hào)、pin腳功能描述的對(duì)應(yīng)關(guān)系也可以在pin_arduino.h文件中查找到??紤]到iDuino開發(fā)板開放了所有的電路原理圖,所以用戶可以從多個(gè)獲取到iDuino開發(fā)板,既可以直接從網(wǎng)絡(luò)也可以自行設(shè)計(jì)生產(chǎn),如果是花錢的,那么板子應(yīng)該已經(jīng)Fuse的設(shè)置和BootLoader的上載后才能和本書描述的集成開發(fā)環(huán)境配合使用,具體的設(shè)置過程如下:FTDIATMELJTAGICEMKIIAVRISPiDuinoICSP編口,USB口在左,天線座在右的情況下,ICSP的線序如下:-14ICSPProgramModeISPReadSignature,如果不能請(qǐng)檢查連接,如果可ReadSignatureFuseTABFuseMCU能夠從BootLoader啟動(dòng),對(duì)于者來說,設(shè)置MCU從BootLoader啟動(dòng)就相當(dāng)于把MCU的FLASH空間分成了兩個(gè)區(qū),BootLoader就是系統(tǒng)的引導(dǎo)區(qū),剩余的則是用戶應(yīng)用程-15FUSEFUSE設(shè)置完成后則到ProgramTAB中,在FLASH下選擇BootLoader文件上載,即光盤自帶Arduino 下的hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega128rfa1.Hex文件,上載完成后,有一個(gè)指示燈會(huì)不斷閃爍,即表示BootLoader上載成功。對(duì)于 理解成計(jì)算機(jī)的Bios程序,它的唯一作用就是接收計(jì)算機(jī)發(fā)給MCU的應(yīng)用程序并把它保存在MCUFLASH的應(yīng)用程序區(qū)。我們需要注意的是,用戶可以通過多種非BootLoader方式上載程序到iDuino中,如第三章iDuino開發(fā)環(huán)境設(shè)Arduino集成開發(fā)平臺(tái)雖然是Arduino的軟件開發(fā)平臺(tái),但它只能實(shí)現(xiàn)最簡(jiǎn)單的文EclipseiDuino程序,因?yàn)镋clipse具有廣泛地群眾基礎(chǔ),IDEArduinoforEclipse插件,開發(fā)起來非常方便。 開發(fā)平臺(tái)的安裝Arduino開發(fā)平臺(tái)無需安裝,直接從Arduino官網(wǎng) 的IDE開發(fā)環(huán)境,AVR-GCC編譯工具鏈,Arduino 代碼庫(kù)等內(nèi)容,本書參照的是1.5.2版本,其 ,用戶只需要選擇windows版本即可。需要注意的是,iDuino并不是Arduino 支持的開發(fā)板,所以Arduino 移植后才能配合iDuino使用,當(dāng)然,此工作已經(jīng)由本書的作者完成,用戶可以直接從/smeshlink/Arduino-Plus處移植好的Arduino庫(kù);另外,本書中還用到了大量的第Arduino擴(kuò)展庫(kù),這些庫(kù)有些可以直接使用,有些也需要做相應(yīng)的 /smeshlink/ArduinoLib-SMeshlink處更改過的擴(kuò)展庫(kù)。我們建議把ArduinoLib-SMeshlink放在Arduino根下,即包括擴(kuò)展庫(kù)在內(nèi)的Arduino
圖表三-1Arduino平 結(jié)EclipseEclipseJAVA運(yùn)行環(huán)境就可以使用,iDuino推薦使用界面如下圖所示(高版本的Eclipse有可能有兼容性問題,請(qǐng)用戶自行嘗試:圖表三-2Eclipse以通過查看系統(tǒng)信息獲知。Eclipse后解壓即可食使用-3help->installnewsoftwareAdd按鈕并輸入以下內(nèi)容,選擇OK后繼續(xù)。pluginLocation:-4 -5許安裝非簽名認(rèn)證(unsignedcontent)的內(nèi)容,并根據(jù)提示重新啟動(dòng)Eclipse;Eclipsewindows->preferencesArduino->Arduino的位置,PrivateLibrarypath指的是自己創(chuàng)建的庫(kù)函數(shù)的位置。我們這里只能使用 日后通過F3這一快捷鍵快速地定位在函數(shù)或變量的定義位置;-8Eclipse 給iDuino使用的Arduino程序。-9 -10此時(shí),Eclipse-10此時(shí),EclipseoWorldArduino項(xiàng)目Includes文件,一部分是AVR-GCC自帶的頭文件,另外一部分則是Arduino 文件;接著是arduino,其中包括了所有的Arduino庫(kù)代碼,core部分是大家都一樣的庫(kù)代碼,variant部分則是本開發(fā)板即iDuino的管腳映射定義文件;本項(xiàng)目編譯完成后的二進(jìn)制文件將會(huì)出現(xiàn)在 下,剩下-11 //Donotremovetheinclude#include"oWorld.h"#defineLEDGREEN23#defineLEDYELLOW#defineLEDRED//Thesetupfunctioniscalledonceatstartupofthesketchvoidsetup(){}}//Theloopfunctioniscalledinanendlessloopvoidloop(){}AVRMemory---------------Device: 1666bytes(1.3%Full)(.text+.data+.bootloader) 9bytes(0.1%Full)(.data+.bss+Finishedbuildingtarget:oWorld15:07:16BuildFinished(took16s.452ms)avrdude:AVRdeviceinitializedandreadytoacceptReading|##################################################|100%avrdude:Devicesignature=avrdude:NOTE:"flash"memoryhasbeenspecified,anerasecyclewillbeperformedTodisablethisfeature,specifythe-Doption.avrdude:erasingchipavrdude:readinginputfileavrdude:writingflash(1666bytes):Writing|##################################################|100%avrdude:1666bytesofflashwrittenavrdude:verifyingflashmemoryagainstavrdude:loaddataflashdatafrominputfile avrdude:inputfile oWorld.hexcontains1666avrdude:readingon-chipflashReading|##################################################|100%avrdude:verifyingavrdude:1666bytesofflashverifiedavrdudedone.Thankyou.iDuino3LED1秒亮一次,此時(shí)你已完成使用F3查找它的定義,當(dāng)然,-12第四章Arduino程序設(shè)計(jì)初步前面我們已經(jīng)完成了基于Arduino的第一個(gè)程序,但通過回顧源代碼我們發(fā)現(xiàn),oWorldC++main函數(shù),也沒有一般單片機(jī)程序必須Arduino程序的體系機(jī)構(gòu)開始。 程序的體系結(jié)Eclipse菜單中的Search->Search功能可以找到main函數(shù)的所在位置:-1 intmain(void){#ifdefined(USBCON)for(;;){if(serialEventRun)}return}loop函數(shù)完成用戶的持續(xù)性工作,在循環(huán)的過程中如果loop函數(shù)中完成,這兩個(gè)函數(shù)的名稱是固定的,不能initF3init函數(shù)具體完成的工作,這些代這樣,我們才能使用后續(xù)將會(huì)提到的功能和時(shí)間計(jì)數(shù)功能。 oWorld的源代碼中我們還發(fā)現(xiàn)了幾個(gè)陌生的函數(shù),它們分別是pinMode、函數(shù)的定義都是Arduino MCU操作的復(fù)雜性和差異性,從而簡(jiǎn)化了我們上層應(yīng)用程序的開發(fā)。 程序的語(yǔ)言基ArduinoC++進(jìn)行編寫,并在此基礎(chǔ)上添加了一些自定義的函數(shù)和常量,所以我們?cè)谶@有必要簡(jiǎn)單地了解一下Arduino的語(yǔ)言基礎(chǔ)。常Arduinoconst關(guān)鍵字實(shí)現(xiàn)的,最常用的常量被定義在Arduino.h中,關(guān)鍵內(nèi)容及解釋如下//定義數(shù)字管腳電平#defineHIGH0x1#defineLOW//定義管腳輸入輸出方向#defineINPUT0x0#defineOUTPUT0x1#defineINPUT_PULLUP0x2//定義布爾類型常量#definetrue0x1#definefalse//定義字節(jié)序#defineLSBFIRST#defineMSBFIRST//定義中斷觸發(fā)模式#defineCHANGE#defineFALLING#defineRISING//定義ADC參考#ifdefined(AVR_ATtiny24)||defined(AVR_ATtiny44)||defined(AVR_ATtiny84||defined(AVR_ATtiny25)||defined(AVR_ATtiny45)||defined(AVR_ATtiny85)#defineDEFAULT0#defineEXTERNAL#defineINTERNAL2#ifdefined(AVR_ATmega1280)||defined(AVR_ATmega1281)||defined(AVR_ATmega2560)||defined(AVR_ATmega1284P)#defineINTERNAL1V12#defineINTERNAL2V56#elifdefined(AVR_ATmega128RFA1)||defined(AVR_ATmega256RFR2)#defineINTERNAL1V52#defineINTERNAL1V63#defineINTERNAL3#defineDEFAULT#defineEXTERNAL0途定義,如iDuino//iDuino支持的數(shù)字管腳個(gè)#define//iDuino支持的模擬管腳個(gè)#defineNUM_//iDuino的SPI管腳序號(hào)定conststaticuint8_t=8conststaticuint8_t=conststaticuint8_tMISO=12;conststaticuint8_tSCK=13;//iDuino的I2C管腳序號(hào)定conststaticuint8_tSDA=21;conststaticuint8_tSCL=conststaticuint8_tA014;conststaticuint8_tA115;conststaticuint8_tA216;conststaticuint8_tA317;conststaticuint8_tA418;conststaticuint8_tA519;conststaticuint8_tA633;conststaticuint8_tA7//iDuino的具體管腳到序號(hào)的定義,由定義PORT和位置定義兩部分?jǐn)?shù)組組constuint8_tPROGMEMdigital_pin_to_port_PGM[]=constuint8_tPROGMEMdigital_pin_to_bit_mask_PGM[]=變量及其數(shù)據(jù)類型只要沒有超過內(nèi)存限制,ArduinoC++語(yǔ)法自由定義變量,但變量的數(shù)據(jù)類型 占用1個(gè)字節(jié)。unsignedint:無符號(hào)整型,數(shù)值范圍是0到65535,占用2個(gè)字節(jié)。long: ,占用4個(gè)字節(jié)。unsignedlong:無符號(hào)長(zhǎng)整型,數(shù)值范圍是0到 ,占用4個(gè)字節(jié)。float:intlight[6]={0,20,50,75,以上都屬于基本類型,ArduinoString字符串類型等,這些會(huì)在后運(yùn)算Arduino繼承了C++的運(yùn)算符,包括 參與運(yùn)算的數(shù)據(jù)類型的不同會(huì)導(dǎo)致結(jié)果的不同,如都是整型的情況下10/3=3,而有浮點(diǎn)型1000溢出后的結(jié)果:bytei=10;右移(<<)6中二進(jìn)制運(yùn)算符??刂平Y(jié)if(val==1)}}:for(inti=0;i<10;}switch{case1:case}intval=while(sensorValue<}{}while(val<直接跳出for循環(huán),執(zhí)行代碼digitalWrite(LEDPIN2,HIGH)。for(light=0;light<255;{if((x>140)&&(x<200))}管腳輸入輸出函數(shù)前面的oWorld代碼中已經(jīng)用到了管腳輸入輸出函數(shù),其作用就是設(shè)置和管腳的電平情況,Arduino包含了以下管腳輸入輸出函數(shù):voidpinMode(uint8_tpinuint8_tmode):設(shè)置管腳的輸入輸出方向,pin表示管腳的序號(hào),mode表示方向,只能取INPUT,OUTPUT兩個(gè)值,如下面的代碼把管腳10設(shè)成輸入:voiddigitalWrite(uint8_tpin,uint8_tval):設(shè)置管腳的數(shù)字電平,pin表示管腳的序號(hào),value表示電平,只能取HIGH,LOW兩個(gè)值,如下面的代碼把管腳10設(shè)成高電平:intdigitalRead(uint8_tpin):返回管腳的數(shù)字電平,pin表示管腳的序號(hào),val=intogRead(uint8_tpin):返回管腳的模擬電平,AD采樣的結(jié)果,只能用在模擬管valogRead(A、voidogWrite(uint8_tpin,intval):設(shè)置管腳的輸出來模擬模擬輸出,只能用在支持的管腳上,pin表示管腳的序號(hào),valuedutycycle0-255,0表示0V輸出,255表示滿載輸出,相當(dāng)于高電平。voidshiftOut(uint8_tdataPinuint8_tclockPinuint8_tbitOrderuint8_tval):從一個(gè)管腳序號(hào),bitOrderLSBFIRSTMSBFIRST,表示低位優(yōu)先還是優(yōu)先,valueuint8_tshiftIn(uint8_tdataPin,uint8_tclockPin,uint8_tbitOrder)1個(gè)字節(jié),需要外部硬件配合,dataPin表示數(shù)值管腳的序號(hào),clockPin表示時(shí)序管腳的序號(hào),bitOrder表示模式,取值為L(zhǎng)SBFIRST或MSBFIRST,表示低位優(yōu)先還是優(yōu)先,返回值范0-255。unsignedlongpulseIn(uint8_tpinuint8_tstateunsignedlongtimeout):測(cè)量一個(gè)管腳脈timeout7高電平脈沖持續(xù)的時(shí)間。time=時(shí)間函Arduino提供了以下四個(gè)和時(shí)間相關(guān)的函數(shù),分別是:unsignedlongmillis():返回系統(tǒng)運(yùn)行了多長(zhǎng)時(shí)間,單位是毫秒。unsignedlongmicros():返回系統(tǒng)運(yùn)行了多長(zhǎng)時(shí)間,單位是微秒。delay(unsignedlongms):讓系統(tǒng)等待一段時(shí)間,輸入?yún)?shù)的單位是毫秒,在這段時(shí)間里,除了中斷voiddelayMicroseconds(unsignedintus):讓系統(tǒng)等待一段時(shí)間,輸入?yún)?shù)的單位是微秒,同樣在這數(shù)學(xué)函Arduino程序可以使用所有的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù),另外還添加了以下函數(shù):min(x,y):返回最小值。 longrandom(longhowsmall,longhowbig):返回一個(gè)howsmallhowbig之間的隨機(jī)數(shù),,random(10,100)將返回一個(gè)10-100longmap(longxlongin_minlongin_maxlongout_minlongout_max):把x的值從in_min到percent=串口函 oWorld程序的編寫,但我們并沒有看到任何 oWorld字符的輸出,當(dāng)然,我們也看到了iDuino并沒有任何顯示設(shè)備,那么怎樣直觀地輸出” 機(jī)都有多于一個(gè)以上的串口,所以Serial代表UART0,Serial1代表UART1,Serial帶表UART2,依次類voidbegin(unsignedlongbaud):初始化串口,并工作在數(shù)值為baud的波特率下,如下面的代碼啟 intpeek(void):返回串口緩沖區(qū)中的當(dāng)前數(shù)據(jù),并保留緩沖區(qū)中數(shù)據(jù)不變;intread(void)voidflush(void):等待處理器發(fā)送所有待發(fā)送數(shù)據(jù)完成后返回;size_twrite(uint8_t)size_twrite(constuint8_t*buffer,size_tsize):往串口寫入一個(gè)字節(jié)數(shù)組中前面部分,其字節(jié)數(shù)為size; size_tprint(constString&);size_tprint(constchar[]);size_tprint(char);size_tprint(unsignedchar,int=DEC);size_tprint(int,int=DEC);size_tprint(unsignedint,int=DEC);size_tprint(long,int=DEC);size_tprint(unsignedlong,int=DEC);size_tprint(double,int=2);,Serial.print(75);//輸出"75"Serial.print(75,DEC);//輸出"75"Serial.print(75,HEX);//輸出"4B"Serial.print(75,OCT);//輸出"113"Serial.print(75,BIN);//輸出" Serial.print(75BYTE輸出"K",75代表的字,, #defineLEDGREEN23#defineLEDYELLOW#defineLEDREDvoidsetup(){}void{Serial.print("oWorld,TheBoardhavestarted");}斷地打印系統(tǒng)運(yùn)行了多長(zhǎng)時(shí)間,你可以使用任何一個(gè)串口調(diào)試工具來查看輸出效果,下圖是我們使用串圖表四- oWorld2輸?shù)谖逭耰Duino管腳基礎(chǔ)應(yīng)用iDuino226AD輸入模擬管腳,還有5個(gè)可以當(dāng)作輸出管腳,6個(gè)可以當(dāng)作外部中斷管腳,具體的管腳用途定義 管腳的數(shù)字輸入輸出字信號(hào),iDuino的所有管腳都可以當(dāng)數(shù)字輸入輸出管腳。為了實(shí)現(xiàn)數(shù)字信號(hào)的輸入輸出,用戶首先需要通過pinMode函數(shù)把管腳設(shè)置成輸入輸入電平的高低,而對(duì)于輸出管腳,則可以通過digitalWrite設(shè)置輸出電平的高低,下LED1boolvoid{}void{} digitalRead函數(shù),所以上面的代碼可以簡(jiǎn)化如下:void{}void{}來模擬用戶的控制,代碼如下:void{}void{if(digitalRead(3))}
GND即地,此時(shí)就可以發(fā)現(xiàn)燈滅了,因?yàn)榈碾娖绞堑?,這樣就達(dá)到了用戶控制的目的,實(shí)際上,你用手摸一下voidsetup(){}void{if(oldinputlevel!=newinputlevel)} 管腳的外部中斷處理5.1部分代碼的工作模式我們稱之為輪詢模式,在該種模式下,代碼需要不斷地去檢查管void{}void{attachInterrupt(1,myhanlder,}void{}中的attachInterrupt(1,myhanlder,FALLING)表示的是當(dāng)由下降沿觸發(fā)的中斷1產(chǎn)生時(shí)系統(tǒng)會(huì)自不使用使用不使用使用#include#includevoidvoid{{}}voidvoid{{}attachInterrupt(1,myhanlder,void}{voidattachInterrupt(1,myhanlder,{}}-1iDuino是Arduino提供的delay函數(shù),這是因?yàn)閐elay函數(shù)中有所有中斷的操作,從而會(huì)導(dǎo)致中斷函數(shù)不能正常觸發(fā),有的讀者可以自己嘗試一下效果。在Arduio中也有對(duì)應(yīng)的中斷#defineinterrupts()sei()void{//關(guān)鍵的,時(shí)間敏感的代}voidattachInterrupt(uint8_tinterruptNum,void(*userFunc)(void),int{if(interruptNum<EXTERNAL_NUM_INTERRUPTS){intFunc[interruptNum]=userFunc;#elifdefined(EICRA)&&defined(EICRB)&&caseEICRA=(EICRA&~((1<<ISC00)|(1<<ISC01)))|(mode<<ISC00);EIMSK|=(1<<INT0);case3:EICRA=(EICRA&~((1<<ISC10)|(1<<ISC11)))|(mode<<ISC10);EIMSK|=(1<<INT1);case4:EICRA=(EICRA&~((1<<ISC20)|(1<<ISC21)))|(mode<<EIMSKEIMSK|=(1<<case5:EICRA=(EICRA&~((1<<ISC30)|(1<<ISC31)))|(mode<<ISC30);EIMSK|=(1<<INT3);case0:EICRB=(EICRB&~((1<<ISC40)|(1<<ISC41)))|(mode<<ISC40);EIMSK|=(1<<INT4);case1:EICRB=(EICRB&~((1<<ISC50)|(1<<ISC51)))|(mode<<ISC50);EIMSK|=(1<<INT5);case6:EICRB=(EICRB&~((1<<ISC60)|(1<<ISC61)))|(mode<<ISC60);EIMSK|=(1<<INT6);case7:EICRB=(EICRB&~((1<<ISC70)|(1<<ISC71)))|(mode<<ISC70);EIMSK|=(1<<INT7);}}}0123674561001236745610732-2iDuinoiDuinoADC采樣精度、采樣頻率和采樣范圍,對(duì)于iDuino使用的Atmega128RFA110位 INTERNAL1V5:1.5VINTERNAL1V6:1.6VDEFAULT:默認(rèn)內(nèi)部1.8VEXTERNAL:通過AREF管腳輸入的外部參考電壓。voidsetup(){}voidloop() Serial.print(""); Serial.print(""); Serial.print("");Serial.println("");}的的采樣出來的電壓值即采樣數(shù)值*1.8/1023和用萬(wàn)用表量電池電壓的結(jié)果做比較,從而驗(yàn)證
-1ADC在此電路中,34R2,R1供電,然后通過同一個(gè)模擬輸入管AD1R0上端的電壓,假設(shè)其測(cè)量值為xR2R1的電阻就是 其中y=x*1.8/1023 voidsetup(){}voidloop() Serial.print("");Serial.print("");}iDuino輸入輸出的使們這里的模擬輸出指的是輸出,即脈寬調(diào)制,通過在極短時(shí)間內(nèi)高低電平比例的不同來達(dá)到等效模擬輸出的效果,iDuino3,5,6,8,95個(gè)數(shù)字管腳支持輸出。 v0tv0tv0t圖表五- 輸為了驗(yàn)證輸出的效果,我們需要使用19(該管腳支持輸出)GND的兩端,需要注意的是,發(fā)光二極管是有方向性的,管腳長(zhǎng)的那段是正極,必須接到電壓高的那端,這里就是數(shù)字管腳9,驗(yàn)證代碼如下:voidsetup()}voidloop()for(int{}}簡(jiǎn)單,但為了更深刻地理解輸出的使用原理,用戶需要閱讀ogWrite函數(shù)的具體實(shí)現(xiàn),簡(jiǎn)單來說,它是通過計(jì)時(shí)器實(shí)現(xiàn)的,不同的輸出對(duì)應(yīng)不同的計(jì)時(shí)器,只有具備輸出功能的管腳才能體現(xiàn)ogWrite的效果。在實(shí)際應(yīng)用中,當(dāng)然不僅僅用于改變LED燈的亮度,它還可以通過附加電路輸出不壓的直流電平,控制電機(jī)、輸出音樂等,下面的例子將輸出一個(gè)完整的音階:#defineNOTE_G7#defineNOTE_GS7#defineNOTE_A7#defineNOTE_AS7#defineNOTE_B7#defineNOTE_C8#defineNOTE_CS8#defineNOTE_D8#defineNOTE_DS8intmelody[]={NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,intnoteDurations[]={2,2,2,2,2,2,2,2};voidsetup(){for(intthisNote=0;thisNote<8;{intnoteDuration= intpauseBetweenNotes=noteDuration*1.30;}}voidloop()}9和GNDanologWrite函數(shù)的,但如果你深入去研tone函數(shù)的實(shí)現(xiàn),你會(huì)發(fā)現(xiàn)它們的原理是一樣的,用戶在此代碼的基礎(chǔ)上可以簡(jiǎn)單修改后讓iDuino演奏一曲完整的音樂。Arduino還提供了專門測(cè)量波形脈寬的函數(shù),用于輸出的傳感器,其中pin表示管腳號(hào),state表示測(cè)量的是低電平脈沖還是高電平脈沖,timeout表示超時(shí)時(shí)間,碼綜合展示了輸入輸出的使用:void}voidloop()longfor(int Serial.print("Value:");Serial.print("Highpulsetime(us):"); Serial.print("Lowpulsetime(us):");}}Value:1Highpulsetime(us):2Lowpulsetime(us):982Value:2Highpulsetime(us):6Lowpulsetime(us):978Value:3Highpulsetime(us):10Lowpulsetime(us):974Value:4Highpulsetime(us):14Lowpulsetime(us):969Value:5Highpulsetime(us):18Lowpulsetime(us):967Value:6Highpulsetime(us):22Lowpulsetime(us):963Value:7Highpulsetime(us):25Lowpulsetime(us):959Value:8Highpulsetime(us):29Lowpulsetime(us):953Value:9Highpulsetime(us):33Lowpulsetime(us):949Value:10Highpulsetime(us):37Lowpulsetime(us):946從中可以看出,value的不同,其高電平和低電平的占空比是不同的,另外還可以知道,1K左右,實(shí)際上,iDuino16M主頻,輸出64分頻,再加上的計(jì)數(shù)值是256,/64/2561K,也就是 內(nèi)部溫度及供電電壓的測(cè)Atmega128fa1內(nèi)置了一個(gè)溫度傳感器,它本質(zhì)上也是采用ADC來實(shí)現(xiàn)溫度的測(cè)量的,但由于Arduio并沒有提供對(duì)應(yīng)的庫(kù)函數(shù),所以須通過相關(guān)寄存器的操作來實(shí)現(xiàn)MCU內(nèi)部Atmega18rfa1的Datashet<avr/io.h>AVR各個(gè)系列MCU的寄存器定義。另外,我們還需要理解的是,MCU內(nèi)部的寄存器它只是用來監(jiān)測(cè)MCU的工作狀態(tài),你通過串口器可以發(fā)現(xiàn),它的數(shù)值和實(shí)際的數(shù)值還是有很大的差別的。為了驗(yàn)證此程序的正確性,你可以把手按在MCU上,此時(shí),你可以發(fā)現(xiàn)溫度值會(huì)不斷升高,這是因?yàn)槟愕捏w溫比環(huán)境溫度高的緣故,從而驗(yàn)證了程序的有效性。#ifndefcbi#definecbi(sfr,bit)(_SFR_BYTE(sfr)&=~_BV(bit))#ifndef#definesbi(sfr,bit)(_SFR_BYTE(sfr)|=_BV(bit))intvoidsetup(){}voidloop()}int{intreading=0;intresult=0;ADMUX=_BV(REFS1)|_BV(REFS0)|0b1001;ADCSRA=_BV(ADEN)|_BV(ADPS0)|_BV(ADPS2);reading=ADC; //disable //disable //turnoffinternalvrefreturnreading*113-27280;}供電電壓(由于是穩(wěn)壓過后的電壓,所以電壓不會(huì)變化),其本質(zhì)也是ADC #include<avr/io.h>doublevoltage=0.0;inti;voidsetup()}voidloop()BATMON=for(i=16;i<31;{BATMON=if((BATMON&(1<<BATMON_OK))==0)}}iDuinoPCINTAVRPCINTDATASHEET上的管腳讓MCU從各種休眠狀態(tài)中喚醒,但在使用時(shí),PCINT的使用要復(fù)雜的多。斷,默認(rèn)情況下,PCINT功能是被的,用戶需要更改PCICR寄存器來使斷,默認(rèn)情況下,PCINT功能是被的,用戶需要更改PCICR寄存器來使能某個(gè)PCINT中斷,當(dāng)然,已經(jīng)有很多作者為Arduino開發(fā)了PCINT中斷的庫(kù),這可以大大簡(jiǎn)化我們使用PCINT功能,我們這里介紹的是PinChangeInt中斷庫(kù),用戶可以從下面的地址: 當(dāng)然,為了讓該庫(kù)支持()的上#if|| || || || 即結(jié)#if || || || || ||defined(AVR_ATmega128RFA1或下降沿觸發(fā)。iDuinoPB5管腳已經(jīng)與板上的按鍵相連,當(dāng)按鍵被按下時(shí),PB5管腳會(huì)被PCInt功能來處理該中斷,下面代碼的作用是用戶每按一次鍵,LED就變#include<PinChangeInt.h>#defineINTPIN20//PCINT0voidledfunc(){digitalWrite(INTPIN,HIGH);void{pinMode(INTPIN,PCintPort::attachInterrupt(INTPIN,&ledfunc,FALLING);}voidloop()}第六章iDuino串口通訊及字符串操作Receiver/ansmiter負(fù)邏輯電平,它定義+5~+12V為低電平,而-12~-5ViDuinoTTL電UART口,其中的一個(gè)(UART0)USBTTL電平和電腦相連,另外一個(gè)(UART1)的則連接到數(shù)字管腳0,1給用戶使用。 串口函數(shù)的工作原理iDuino的串口有深入ArduinoHardwareSerial.cpp文件。仔串口的初始SerialSerial1UART0UART1,為了工作在9600波特率。串口初始化函數(shù)begin的全部代碼如下:voidHardwareSerial::begin(unsignedlong{booluse_u2x=true;#ifF_CPU //hardcodedexceptionforcompatibilitywiththebootloader//withtheDuemilanoveandpreviousboardsandthefirmwareonthe//ontheUnoandMega2560.if(baud==57600){use_u2x=}if(use_u2x)*_ucsra=1<<baud_setting=(F_CPU/4/baud-1)/}else*_ucsra=baud_setting=(F_CPU/8/baud-1)/}if((baud_setting>4095)&&{goto}*_ubrrh=baud_setting>>sbi(*_ucsrb,_rxen);sbi(*_ucsrb,_txen);sbi(*_ucsrb,_rxcie);cbi(*_ucsrb,_udrie);}其中sbi(*_ucsrb,_rxen)之前的代碼完成的都是波特率的設(shè)定工作,用戶可以參考datasheet加以解讀,sbi(*_ucsrb_rxen);sbi(*_ucsrb_txen);sbi(*_ucsrb_rxcie);這三句完發(fā)送和接收隊(duì)列 及中斷的處數(shù)據(jù)時(shí),Arduino只是把數(shù)據(jù)放到發(fā)送隊(duì)列中,并使能發(fā)送寄存器清空中斷,代碼如下:unsignedcharc=inti=(unsignedint)(buffer->head+1)%SERIAL_BUFFER_SIZE;if(i!=buffer->tail){buffer->buffer[buffer->head]=c;buffer->head=i;}size_twrite(uint8_t{inti=(_tx_buffer->head+1)%while(i==_tx_buffer-;_tx_buffer->buffer[_tx_buffer->head]=_tx_buffer->head=i;sbi(*_ucsrb,_udrie);//使能中斷return1;}if(tx_buffer.head==tx_buffer.tail)//Bufferempty,sodisableinterrupts#ifdefined(UCSR0B)cbi(UCSR0B,cbi(UCSRB,}else//Thereismoredataintheoutputbuffer.Sendthenextbyteunsignedcharc=tx_buffer.buffer[tx_buffer.tail];tx_buffer.tail=(tx_buffer.tail+1)%SERIAL_BUFFER_SIZE;UDR0=c;UDR=c;#errorUDRnotdefined}用戶調(diào)用接口的實(shí)現(xiàn)void{#ifdef#ifdefif(Serial1.available())#ifdef#ifdef}int{for(;;)if(serialEventRun)}return} {while(_tx_buffer->head!=_tx_buffer-;}初看此代碼,似乎什么都沒干,但仔細(xì)考慮一下就可以理解,在此while循環(huán)的過, 串口的雙向通訊輪詢方式的串口雙向通訊voidsetup()}voidloop()while(Serial.available())}中斷方式的串口雙向通訊voidsetup()}voidloop()}void{while(Serial.available())}況,為了改變此情況,你可以簡(jiǎn)單地把#defineSERIAL_BUFFER_SIZE1024替換原來的定義即中斷方式的串口操作有時(shí)候還可以用于等待特定的輸入,下面是ArduinoStringinputString=""; //astringtohold ingdata plete=false;//whetherthestringiscompletevoidvoidsetup()//reserve200bytesfortheinputString:}voidloop()//printthestringwhenanewlinearrives:if( plete){//cleartheinputString=plete=}}SerialEventoccurswheneveranewdatacomesinthehardwareserialRX.Thisroutineisrunbetweeneachtimeloop()runs,sousingdelayinsideloopcandelayresponse.Multiplebytesofdatamaybeavailable.voidserialEvent()while(Serial.available())//getthenewcharinChar=//addittotheinputString+=//if ingcharacterisanewline,seta//sothemainloopcandosomethingaboutit:if(inChar=='\n'){plete=}}}voidserialEvent()while(Serial.available())//getthenewuint8_tinChar=//addittotheinputString+=//if ingcharacterisanewline,seta//sothemainloopcandosomethingaboutif(inChar==‘\r’)plete=}}}我們說的回車換行是有兩個(gè)字符組成的,即0D0A‘\rn’,用0D作為回車標(biāo)記更有意義。串口雙向通訊中的交互等待6.2.2就是一個(gè)簡(jiǎn)單地實(shí)現(xiàn),但這種方式靈活性并不好,下面是一個(gè)我認(rèn)為更理想的實(shí)現(xiàn)方charrxbuffer[30];{while}voidWaitForKey(char{while(Serial.available()){}}voidsetup()}voidloop()intSerial.println("Pleaseenteryouname,andendwithwhile{{}
} o,younameis:");Serial.println("Pleaseenterentertocontinue");}該代碼中,WaitForAnyKey()這句話很關(guān)鍵,如果沒有這句的話,只要用戶輸入13就是前面說的回iDuinoArduinoArduino專門提供了字符串這一對(duì)象數(shù)據(jù)類型,并自帶了多個(gè)字符串操作方法,為了體現(xiàn)Arduino字符串操作的優(yōu)勢(shì),我們先來看下面的例子:Stringtext1=" Stringtext2="World!";voidsetup(){Serial.print("text1is");Serial.print(text1);Serial.print("");Serial.println("characterslong.");Serial.print("text2is");Serial.print(text2);Serial.print("");Serial.println("characterslong.");Serial.println("text1nowcontains:");Serial.println("characterslong.");}void{{}text1is o5characterslong.text2is World!7characterslong.text1nowcontains:ochartext1[]=" chartext2[]="World!";chartext3[80];voidsetup(){Serial.print("text1is");Serial.print("");while{}Serial.println("charactersSerial.print("text2is");Serial.print("");while{}Serial.println("charactersfor(int{}for(int{text3[i]=text2[i-}Serial.println("text3nowcontains:");Serial.println("characterslong.");}void{}就小于0,如果相等則等于0;unsignedcharendsWithconstString&s2s2結(jié)尾,1,否則返回0;unsignedcharequals(constString&s2):判斷兩個(gè)字符串是否相等,注意,此函數(shù)是區(qū)分voidgetBytes(unsignedchar*buf,unsignedintbufsize,unsignedintindex):當(dāng)前字符串到bufindex開發(fā),傳bufsizebufsize,的字符串個(gè)bufsize-1(最后一個(gè)字節(jié)是0用于標(biāo)記char字符串口結(jié)束);intindexOf(charch,unsignedintfromIndex):返回字符在當(dāng)前字符串中出現(xiàn)的位置,可以傳入?yún)?shù)fromindex表示從哪里開始找,如果返回–1表示沒找到;intlastindexOfcharchunsignedintfromIndex):返回字符在當(dāng)前字符串中出現(xiàn)的最后位置,可以傳入?yún)?shù)fromindex表示從哪里開始找,如果返回–1表示沒找到;unsignedintlength():voidrece(charfind,charrece):把當(dāng)前字符串中的字符find替換成re)unsignedcharstartsWithconstString&s2):s2開始,1,否則返回0;)Stringsubstring(unsignedintleft,unsignedintright)返回當(dāng)前字符串leftright之間的字符串,包括left位置的字符但不包括right位置的字符;voidtoCharArray(char*buf,unsignedintbufsize,unsignedintindex=0):把當(dāng)前字符串復(fù)制到buf中,的長(zhǎng)度是bufsize-1;longtoInt(void):把當(dāng)前字符串轉(zhuǎn)換成長(zhǎng)整數(shù);voidtoLowerCase():把當(dāng)前字符串全部轉(zhuǎn)換成小寫;voidtrim():去掉字符串開始和結(jié)束的空格。Stringtext1=Stringtext2=char*str="AaBbCcDdEeFf";charbuf[20];Stringvoid{text1=" for(int}void{Serial.println("Stringtext1=\"Serial.println("Stringtext2=Serial.println("char*str=\"AaBbCcDdEeFf\"");Serial.print("Aftertmpstr=text2tmpstr=");Serial.print("Aftertmpstr=strtmpstr=");Stringtext1=Stringtext2=char*str="AaBbCcDdEeFf";charbuf[20];Stringvoid{text1=" for(int}void{Serial.println("Stringtext1=\"Serial.println("Stringtext2=Serial.println("char*str=\"AaBbCcDdEeFf\"");Serial.print("Aftertmpstr=text2tmpstr=");Serial.print("Aftertmpstr=strtmpstr=");Serial.print("Aftertext1.concat(text2)text1=");Serial.print("Aftertext1.concat(str)text1=");Serial.print("Aftertext1+100text1="); Serial.print("text1.equals(text2)result=");Serial.print("text1.startsWith(012)result=");Serial.print("text1.startsWith(012)result=");restorestring();Serial.print("text1.charAt(2)result=");Serial.println(text1.charAt(2));text1.getBytes((unsignedSerial.print("Aftertext1.getBytes((unsignedchar*)buf,5,2)buf=");Serial.print("Aftertext1.toCharArray((char*)buf,5,2)buf=");Serial.print("text1.indexOf('5')result=");Serial.print("text1.indexOf('5',2)result=");Serial.print("Aftertext1.substring(5)Serial.print("Aftertext1.substring(5,7)text1=");Serial.print("Aftertext1.rece(\"12\",\"ab\")text1=");Serial.print("Aftertext2.toLowerCase()text2=");Serial.print("Aftertext2.toUpperCase()text2=");Serial.print("text1.toInt()result=");}void{}Stringtext1=" Stringtext2="AaBbCcDdEeFf"char*str="AaBbCcDdEeFf"Aftertmpstr=strtmpstr=AaBbCcDdEeFfAftertext1.concat(text2)text1= Aftertext1.concat(str)text1= Aftertext1+text2text1= Aftertext1+100text1=0123456789100text1.equals(text2)result=0text1.startsWith(012)result=0text1.charAt(2)result=2Aftertext1.setCharAt(2,a)Aftertext1.getBytes((unsigne
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場(chǎng)內(nèi)的商鋪?zhàn)赓U合同
- 停車場(chǎng)承包合同
- 技術(shù)培訓(xùn)委托合同書
- 草籽草坪采購(gòu)合同
- 房屋獨(dú)家代理銷售合同
- 車庫(kù)轉(zhuǎn)讓合同協(xié)議書
- 醫(yī)療美容手術(shù)項(xiàng)目合同協(xié)議書
- 高層管理團(tuán)隊(duì)建設(shè)活動(dòng)方案
- 上海餐飲商鋪?zhàn)赓U合同
- 奶茶店轉(zhuǎn)讓合同(新標(biāo)準(zhǔn)版)8篇
- 消防業(yè)務(wù)開拓方案
- 鑄牢中華民族共同體意識(shí)自評(píng)報(bào)告范文
- 開展戶外探險(xiǎn)與戶外活動(dòng)課件
- HXD3、HXD3CA型電力機(jī)車應(yīng)急故障處理
- 漫畫物理之力學(xué)
- 新浪輿情通建設(shè)方案
- 護(hù)理四種注射法課件
- 單板硬件測(cè)試規(guī)范
- 物流營(yíng)銷(第四版) 課件 第六章 物流營(yíng)銷策略制定
- 關(guān)于市推動(dòng)高新技術(shù)企業(yè)發(fā)展的調(diào)研報(bào)告
- 壯醫(yī)滾蛋治療護(hù)理技術(shù)操作規(guī)范
評(píng)論
0/150
提交評(píng)論