人工智能(AI)識別系統(tǒng)開發(fā)實戰(zhàn) 課件 第2章 開發(fā)基礎(chǔ)_第1頁
人工智能(AI)識別系統(tǒng)開發(fā)實戰(zhàn) 課件 第2章 開發(fā)基礎(chǔ)_第2頁
人工智能(AI)識別系統(tǒng)開發(fā)實戰(zhàn) 課件 第2章 開發(fā)基礎(chǔ)_第3頁
人工智能(AI)識別系統(tǒng)開發(fā)實戰(zhàn) 課件 第2章 開發(fā)基礎(chǔ)_第4頁
人工智能(AI)識別系統(tǒng)開發(fā)實戰(zhàn) 課件 第2章 開發(fā)基礎(chǔ)_第5頁
已閱讀5頁,還剩146頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2.1硬件開發(fā)基礎(chǔ)2.2軟件開發(fā)基礎(chǔ)2.1硬件開發(fā)基礎(chǔ)2.1.1CC3200簡介CC3200是TI針對無線連接SimpleLinkWiFi和物聯(lián)網(wǎng)(IOT)解決方案最新推出的一款MCU(微控制單元),同時也是業(yè)界第一個具有內(nèi)置WiFi的MCU。CC3200采用高性能ARMCortex-M4內(nèi)核,主頻為80?MHz,高達256?KB的RAM,64?KB的ROM,用于存放設(shè)備初始化固件、BOOTLOADER、外設(shè)驅(qū)動庫,如圖2.1-1所示為CC3200芯片。CC3200主要包含MCU、WiFi網(wǎng)絡(luò)處理器和電源管理三大部分。圖2.1-2所示為CC3200的內(nèi)部組成結(jié)構(gòu)圖。CC3200包含有豐富的MCU外設(shè)資源。例如,27個獨立可編程、可復(fù)用的通用輸入輸出接口(GPIO),兩路通用的異步通信收發(fā)器(UART),一路高速串行通信接口(SPI),一路高速I2C接口,一個多通道音頻串行接口(McASP),可支持兩個I2S通道、一個SD/MMC接口、8位并行攝像頭接口、4個通用定時器、16位脈沖寬度調(diào)制(PWM)模式,以及4通道的高達12位模數(shù)轉(zhuǎn)換器(ADC)。CC3200的WiFi網(wǎng)絡(luò)處理器可以提供快速、安全的WLAN和因特網(wǎng)連接,其結(jié)構(gòu)如圖2.1-3所示。CC3200的特性如下:①特有的WiFi片上互聯(lián)網(wǎng)(Internet-On-a-Chip);②專用的ARMMCU,完全免除應(yīng)用MCU的WiFi

和互聯(lián)網(wǎng)協(xié)議處理負擔(dān),WiFi和互聯(lián)網(wǎng)協(xié)議存放于ROM

中;③包含802.11b/g/n射頻、基帶、MAC、WiFi驅(qū)動和Supplicant,內(nèi)置TCP/IP協(xié)議棧;④具有行業(yè)標(biāo)準(zhǔn)BSD套接字應(yīng)用編程接口(API),同時支持8個TCP或UDP套接字,以及兩個TLS和SSL套接字;⑤強大的加密引擎,可以實現(xiàn)支持256位AES加密,快速、安全的互聯(lián)網(wǎng)連接支持站點(STA)、接入點(AP)和WiFi直連(P2P)模式,WPA2可保障個人和企業(yè)安全性;⑥用于自主和快速WiFi連接的SimpleLink連接管理器;⑦用于簡單、靈活WiFi配置的智能配置(SmartConfig)技術(shù)、AP模式和WPS2。2.1.2GPIOGPIO的全稱為GeneralPurposeInputOutput,即通用的輸入輸出,是所有控制器里必備的資源。CC3200的所有數(shù)字引腳和部分模擬引腳,均可作為通用的輸入輸出引腳(GPIO)使用。CC3200將GPIO分為4個組,分別是GPIOA0、GPIOA1、GPIOA2、GPIOA3,每一組GPIO又包含8個引腳。CC3200的引腳分配如表2.1-2所示。根據(jù)功能引腳配置的不同,CC3200最多可以有27個GPIO,且所有的GPIO引腳均具有中斷功能,觸發(fā)的方式支持電平觸發(fā)和邊沿觸發(fā)(上升沿和下降沿)。不僅如此,所有的GPIO都可以用于觸發(fā)DMA,可作為喚醒源。GPIO引腳可編程,可配置為內(nèi)部10?μA的上拉或下拉。驅(qū)動能力可調(diào)節(jié)為2?mA、4?mA、6?mA、8?mA、10?mA、12?mA及14?mA,同樣也支持開漏模式。對GPIO進行操作時,主要需要了解兩大寄存器——GPIODATA寄存器和GPIODIR寄存器。(1)GPIODATA寄存器是數(shù)據(jù)寄存器。在軟件控制模式下,如果對應(yīng)的引腳通過GPIODIR寄存器配置為輸出模式,則寫到GPIODATA寄存器中的值會被傳到對應(yīng)引腳輸出。GPIODATA寄存器有256個別名地址,偏移值為0x000~0x3ff。一個不同地址別名可以用來直接讀/寫任何八個信號位的組合。這個特性可以避免讀—改—寫和軟件讀的位掩碼的時間消耗。在該方案中,為了寫GPIODATA寄存器,掩碼中對應(yīng)于總線中的[9:2]位,必須被置位;否則,在進行寫操作時對應(yīng)位的值不會被改變。同樣,進行讀操作時也是對應(yīng)總線中的[9:2]位,在讀取對應(yīng)位時也必須被置位,否則讀取為0。如果引腳配置為輸出模式,則讀取GPIODATA寄存器,返回最后一次寫入的值;如果配置為輸入模式,則返回對應(yīng)引腳的值。所有位都可以通過復(fù)位清零。如圖2.1-4所示為GPIODATA寄存器。(2)?GPIODIR寄存器是數(shù)據(jù)方向寄存器。在GPIODIR寄存器中,設(shè)置一位對應(yīng)的引腳配置為輸出,清除一位對應(yīng)的引腳配置為輸入。復(fù)位時所有位都清零,也就是說所有的GPIO引腳默認是輸入。如圖2.1-5所示為GPIODIR寄存器。選擇配套的代碼例程,打開GPIO文件夾下的IAR工程,主函數(shù)見代碼清單2.1-1。PinMuxconfig()函數(shù)可由TIPinMuxTools工具生成。打開TIPinMuxTools工具,如圖2.1-6所示。第一步,在Device內(nèi)找到CC3200;第二步,點擊“Start”。如圖2.1-7所示,第一步,點擊“GPIO”處的“添加”,默認是選取全部GPIO;第二步,把“GPIOSignals”前面的鉤去除,不全選;第三步,選擇“GPIO_9”、“GPIO_10”、“GPIO_11”,對應(yīng)開發(fā)板上的3個LED,驅(qū)動LED需要GPIO輸出;第四步,將3個GPIO的“Output”勾選上。最終完成配置的界面如圖2.1-8所示,在最右邊的GeneratedFiles處,點擊“pin_mux_config.c”和“pin_mux_config.h”圖標(biāo),把代碼下載下來并添加到工程中即可。生成好的端口配置函數(shù)如代碼清單2.1-2所示。該函數(shù)主要是對LED對應(yīng)的端口開啟時鐘、設(shè)置方向等。配置好后通過GPIO_IF_LedConfigure()函數(shù)對LED端口進行處理,即將各個LED的端口所對應(yīng)的端口組及屬于該組中的第幾個IO提取出來,如代碼清單2.1-3所示。完成上述兩步后先關(guān)閉所有的LED,然后在一個死循環(huán)內(nèi)執(zhí)行“流水”部分,即按順序以一定的時間間隔開閉LED,如代碼清單2.1-4為“流水”效果實現(xiàn)代碼。編譯程序,生成了相對應(yīng)的bin文件,下載前先插上仿真調(diào)試器TiStellaris,再將旁邊的撥碼開關(guān)“RX”和“TX”撥到“ON”,把啟動方式撥碼選擇為FLASH啟動,即把SOP2撥到“ON”。打開下載工具UniFlash,點擊快速啟動向?qū)е械摹靶履繕?biāo)配置”,在彈出的配置對話框中選擇CC3xSerial(UART)Interface,然后點擊“OK”。然后,在COMPort中輸入板子連接的串口號(根據(jù)電腦進行選擇)。初次使用板子時先燒寫SevciePack,否則程序可能無法運行。點擊“SevicePackProgramming”,選擇之前安裝的SevicePack安裝文件夾目錄下的bin文件即可。點擊左側(cè)界面“/sys/mcuimg.bin”,再在右側(cè)Url中選擇剛剛編譯生成的bin文件,然后選中下方的“Erase”和“Update”,如圖2.1-12所示。選擇“CC31xx/CC32xxFlashSetupandControl”,再點擊“Program”進行下載,如圖2.1-13所示。根據(jù)軟件下方的提示,按下復(fù)位按鍵就可以看到下載的相關(guān)信息。下載完成后如圖2.1-15所示。首先,將下載前改變的撥碼開關(guān)撥回原處,再把撥碼開關(guān)“D5”“D6”和“D7”分別撥到“ON”,使I/O口與LED建立連接關(guān)系,按下復(fù)位開關(guān),可以看到3個LED呈“流水”狀閃爍,如圖2.1-16所示。2.1.3定時器CC3200包含的32位用戶可編程通用定時器共有4個(TimerA0~TimerA3),通用定時器可以對定時器輸入引腳的外部事件進行計數(shù)或定時。每個定時器模塊包含的16位定時/計數(shù)器有兩個(TimerA和TimerB),可以作為定時器或事件計數(shù)器獨立工作,也可以作為一個32位定時器工作。通用定時器模塊具有多種操作模式:16位或32位可編程單次定時器;16位或32位可編程周期定時器;16位通用定時器,帶8位預(yù)分頻器;16位輸入邊沿計數(shù)或時間捕獲模式,帶8位預(yù)分頻器;16位脈沖寬度調(diào)制模式(PWM),帶8位預(yù)分頻器和軟件可編程輸入。這類多種操作模式具有以下特性:①向上或向下計數(shù);②16個16位或32位捕捉比較PWM(CCP)引腳;③可確定產(chǎn)生定時器中斷到進入中斷服務(wù)程序(ISR)的時間;④可觸發(fā)使用DMA的高效傳輸;⑤系統(tǒng)時鐘運行(80?MHz)。下面介紹與定時器編程相關(guān)的常用寄存器。(1)GPTMCFG寄存器主要是配置通用定時器模塊的全局操作,明確通用定時器工作于32位模式還是16位模式下。該寄存器中的值只能是在GPTMCTL寄存器中的TAEN和TBEN兩位被清零時改變。GPTMCFG寄存器如圖2.1-17所示。(2)?GPTMTAMR寄存器配置是基于GPTMCFG寄存器的配置來進行選擇的。在PWM模式中,置位TAAMS位、清除TACMR位和配置TAMR為0x01或者0x02。寄存器如圖2.1-18所示。(3)?GPTMTBMR寄存器控制獨立定時器B的工作模式。當(dāng)定時器A和定時器B同時使用時,該寄存器被忽略,而是通過GPTMTAMR來控制定時器A和定時器B的工作模式。注意:除了TCACT位外,其他位都必須在GPTMCTL寄存器中的TBEN位清零時進行配置。GPTMTBMR寄存器如圖2.1-19所示。(4)?GPTMCTL寄存器為定時器的控制寄存器,如圖2.1-20所示。(5)?GPTMIMR寄存器可以軟件使能/關(guān)閉定時器的控制電平中斷。置位可以打開對應(yīng)的中斷,清零可以關(guān)閉對應(yīng)的中斷。寄存器如圖2.1-21所示。(6)?GPTMRIS寄存器為中斷源狀態(tài)寄存器,通過該寄存器可以獲取中斷源。GPTMRIS寄存器如圖2.1-22所示。(7)GPTMMIS寄存器為中斷掩碼狀態(tài)寄存器,可以檢測是否產(chǎn)生中斷。如圖2.1-23所示為其寄存器。(8)?GPTMICR寄存器用于清除GPTMRIS和GPTMIS寄存器中的狀態(tài)位,寫入1則清除對應(yīng)的中斷。GPTMICR寄存器如圖2.1-24所示。(9)當(dāng)通用定時器被配置為32位模式,GPTMTAILR作為一個32位寄存器(高16位對應(yīng)與定時器B裝載值寄存器的內(nèi)容)。在16位模式,寄存器的高16位讀取值為0,并且對GPTMTBILR寄存器的狀態(tài)沒有影響。如圖2.1-25所示為其寄存器。(10)當(dāng)通用定時器配置為32位模式時,GPTMTBILR寄存器中[15:0]位的內(nèi)容被裝載到GPTMTAILR寄存器的高16位。讀取該寄存器,則返回定時器B的當(dāng)前值,寫操作無效。在16位模式,[15:0]位用于裝載值,[31:16]位保留不使用。如圖2.1-26所示為GPTMTBILR寄存器。(11)當(dāng)通用定時器被配置為32位模式時,GPTMTAMATCHR作為32位寄存器(高16位對應(yīng)GPTMTBMATCHR寄存器的內(nèi)容)。在16位模式,寄存器的高16位讀取為0,并且對GPTMTBMATCHR的狀態(tài)沒有影響。如圖2.1-27所示為GPTMTAMATCHR寄存器。(12)當(dāng)通用定時器配置為32位模式時,GPTMTBMATCHR寄存器的[15:0]位被裝載到寄存器GPTMTAMATCHR寄存器的高16位。讀取該寄存器得到定時器B的當(dāng)前值,寫操作無效。在16位模式中,[15:0]位用于匹配值,[31:16]位保留不使用。如圖2.1-28所示GPTMTBMATCHR寄存器。(13)GPTMTAPR寄存器通過軟件來擴展獨立定時器的范圍。在單次或者周期減計數(shù)模式,該寄存器作為定時計數(shù)器的預(yù)分頻器。如圖2.1-29所示為其寄存器。(14)?GPTMTBPR寄存器通過軟件來擴展獨立定時器的范圍。在單次或者周期減計數(shù)模式,該寄存器作為定時計數(shù)器的預(yù)分頻器。如圖2.1-30所示為其寄存器。(15)?GPTMTAPMR寄存器擴展獨立定時器GPTMTAMATCHR的范圍。當(dāng)寄存器工作于16位模式時,該寄存器表示[23:16]位。如圖2.1-31所示為其寄存器。(16)?GPTMTBPMR寄存器擴展獨立定時器GPTMTAMATCHR的范圍。當(dāng)寄存器工作于16位模式時,該寄存器表示[23:16]位。如圖2.1-32所示為其寄存器。(17)當(dāng)定時器配置為32位模式時,GPTMTAR作為32位寄存器使用(高16位對應(yīng)GPTMTBR寄存器的內(nèi)容)。在16位輸入邊沿計數(shù),輸入邊沿定時和PEM模式,[15:0]位包含計數(shù)器的值,[23:16]位包含預(yù)分頻高8位的值。[31:24]位讀取值始終為0??梢宰x取GPTMTAV的[23:16]位來獲取16位模式單次和周期模式的預(yù)分頻值。讀取GPTMTAPS寄存器可以獲取定期快照模式下的預(yù)分頻值。如圖2.1-33所示為GPTMTAR寄存器。(18)當(dāng)通用定時器配置為32位模式時,GPTMTBR寄存器的[15:0]位被裝載到GPTMTAR寄存器的高16位。讀取該寄存器發(fā)揮定時器B的當(dāng)前值。在16位模式,[15:0]位包含計數(shù)器的值,[23:16]位包含在輸入邊沿計數(shù)、邊沿定時和PWM模式下的預(yù)分頻。[31:24]位讀取為0??梢酝ㄟ^讀取GPTMTBV寄存器中的[23:16]位可以獲取16位單次和周期模式的預(yù)分頻值。讀取GPTMTBPS寄存器可以獲取周期快照模式下的預(yù)分頻。如圖2.1-34所示為GPTMTBR寄存器。(19)當(dāng)定時器配置為32位模式時,GPTMTAV作為32位寄存器(高16位對應(yīng)GPTMTBV寄存器的內(nèi)容)。在6位模式,[15:0]位包含計數(shù)器的值,[23:16]位包含分頻值。在單次或周期減計數(shù)模式,[23:16]位存儲真實的預(yù)分頻值,意味著[15:0]位的值之前,先減[23:16]位的值。[31:24]位讀取始終為0。如圖2.1-35所示為GPTMTAV寄存器。(20)當(dāng)通用定時器配置為32位模式,GPTMTBV寄存器[15:0]位的值被裝載到GPTMTAV寄存器的高16位。讀取該寄存器,則返回定時器B的當(dāng)前值。在16位模式,[15:0]位包含計數(shù)器的值,[23:16]位包含當(dāng)前的預(yù)分頻值。在單次或周期模式,[23:16]位為真實的預(yù)分頻值,意味著在[15:0]位減數(shù)之前,[23:16]位先進行減數(shù)。[31:24]位讀取值為0。如圖2.1-36所示為GPTMTBV寄存器。(21)GPTMDMAEV寄存器允許軟件使能和關(guān)閉定時器DMA觸發(fā)事件。置位則對應(yīng)的DMA觸發(fā)使能,清零則關(guān)閉。如圖2.1-37所示GPTMDMAEV寄存器。本實驗在官方CC3200SDK_1.2.0中timer例程代碼的基礎(chǔ)上修改過來的,用IAR打開Timer_Demo里的工程,編譯下載,從程序可以看到是利用CC3200的定時器TimerA0和TimerA1去控制GPIO_9和GPIO_11亮滅時間。如清單2.1-5所示為該工程的main函數(shù)。在main函數(shù)中PinMuxConfig()初始化了GPIO_9和GPIO_11,通過Timer_IF_Init()初始化了TimerA0和TimerA1,頻率和系統(tǒng)時鐘一致(不分頻),在Timer_IF_Start()函數(shù)中對TimerA0裝載了500這一參數(shù),TimerA1裝載了1000,實際上就是TimerA0定時500?ms進入中斷函數(shù)TimerBaseIntHandler()、TimerA1定時1000?ms進入中斷函數(shù)TimerRefIntHandler(),進入中斷后對I/O口輸出狀態(tài)進行反轉(zhuǎn)。打開UniFlash下載bin文件到板子上(參考GPIO小節(jié)),把D5、D7撥碼開關(guān)撥到ON(程序中使用的是D5、D7),按下復(fù)位鍵,可以看到D5和D7交替閃爍,如圖2.1-38為實驗現(xiàn)象。使用邏輯分析儀可以看到GPIO_9端為1000?ms的脈寬,如圖2.1-39所示。如圖2.1-40可以看到,GPIO_11端的脈寬為500?ms。2.1.4串口串行接口分為異步串行接口和同步串行接口兩種。異步串行接口統(tǒng)稱為通用異步收發(fā)器(UART)接口;同步串行接口有SPI和I2C等,除包含數(shù)據(jù)線外,還有時鐘線。在本次實驗中我們使用的是UART,也就是異步串行接口。UART的相關(guān)標(biāo)準(zhǔn)規(guī)定了接口的機械特性、電氣特性和功能特性等,其中電氣特性標(biāo)準(zhǔn)包括RS-232C、RS-422、RS-423和RS-485等。RS-232C是最常用的串行通信標(biāo)準(zhǔn),也是數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間串行二進制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn),其中DTE包括微機、微控制器和打印機等,DCE包括調(diào)制解調(diào)器MODEM、GSM模塊和Wi-Fi模塊燈。RS-232C的機械特性規(guī)定使用25針D型連接器,后來被簡化為9針D型連接器。RS-232C的電氣特性采用的是負邏輯,即邏輯“1”的電平低于?-3?V,邏輯“0”的電平高于?+3?V。與之相反的是,串口采用的TTL電平是正邏輯不同。邏輯“1”表示高電平,邏輯“0”表示低電平,因此通過RS-232C和TTL器件通信時必須進行電平轉(zhuǎn)換。目前,微控制器的UART接口采用的是TTL正邏輯,與TTL器件相連接時不需要電平轉(zhuǎn)換,而與采用負邏輯的計算機相連接時需要進行電平轉(zhuǎn)換(我們一般使用USB轉(zhuǎn)串模塊)。CC3200包含兩個可編程UART接口(UARTA0~1),主要特性如下:①作為可編程的波特率發(fā)生器,允許速度高達3?Mb/s;②獨立的16×8發(fā)送和接口FIFO,減輕CPU中斷處理負載;③可編程FIFO長度,包括提供傳統(tǒng)雙緩沖接口的單字節(jié)操作;④FIFO觸發(fā)閾值包括1/8、1/4、1/2、3/4和7/8;⑤標(biāo)準(zhǔn)的異步通信起始、停止和奇、偶校驗位。CC3200的UART接口具有以下可編程串行接口特性:①可編程的5、6、7或8位數(shù)據(jù);②奇、偶或無校驗生成/檢測;③一或兩個停止位生成;④支持RTS和CTS調(diào)制解調(diào)器握手;⑤標(biāo)準(zhǔn)的FIFO閾值中斷和傳輸結(jié)束中斷。CC3200的UART支持DMA,使用DMA可實現(xiàn)高效傳輸。UART具有單獨的DMA發(fā)送和接收通道,支持FIFO中有數(shù)據(jù)的單個請求接收和可編程FIFO閾值的突發(fā)請求接收,以及FIFO中有空間的單個請求發(fā)送和可編程FIFO閾值的突發(fā)請求發(fā)送。UARTDR為數(shù)據(jù)寄存器(也是FIFO的接口)。在發(fā)送數(shù)據(jù)時如果FIFO使能了,則寫入該寄存器的數(shù)據(jù)會發(fā)送到FIFO中。如果FIFO關(guān)閉,則數(shù)據(jù)會被存儲在發(fā)送保持寄存器中(發(fā)送FIFO中的最低一個字),寫該寄存器意味著通過串口發(fā)送。在接收數(shù)據(jù)時如果FIFO使能了,數(shù)據(jù)字節(jié)和4位狀態(tài)位被發(fā)送到12位寬的接收FIFO中。如果FIFO關(guān)閉,則數(shù)據(jù)字節(jié)和狀態(tài)被存儲在接收保持寄存器中(接收FIFO中的最低一個字),可以通過讀取該寄存器來獲取接收數(shù)據(jù)。圖2.1-41所示為UARTDR寄存器。UARTRSR_UARTECR是接收狀態(tài)寄存器/錯誤清除寄存器。除UARTDR寄存器外,接收的狀態(tài)位也可以通過UARTRSR寄存器獲取。如果從該寄存器讀取狀態(tài)信息,則狀態(tài)信息對應(yīng)于在讀取UARTRSR寄存器之前的UARTDR的狀態(tài)信息。當(dāng)有溢出條件發(fā)生時,狀態(tài)位中的溢出標(biāo)志位會立刻被置位。UARTRSR寄存器不能被寫,寫任何值到寄存器UARTECR中將會清除幀、校驗、打斷和溢出錯誤。復(fù)位會清零所有的位。圖2.1-42所示為UARTRSR_UARTECR寄存器。UARTFR為標(biāo)志寄存器,在復(fù)位后TXFF、RXFF和BUSY標(biāo)志位為0,TXFE和RXFE位為1。RI和CTS位指示調(diào)制解調(diào)器的控制流和狀態(tài)。這里需要注意的是,調(diào)制解調(diào)位僅在UART1中有效,在UART0中是保留位。圖2.1-43所示為UARTFR。UARTIBRD寄存器是波特率除數(shù)的整數(shù)部分,復(fù)位之后所有的位被清零。最小值為1,UARTIBRD為0,UARTFBRD寄存器無效。當(dāng)改變UARTIBRD寄存器時,只有在當(dāng)前的字節(jié)傳輸完成之后才生效。波特率除數(shù)的任何改變都必須在寫UARTLCRH寄存器之后。UARTFBRD寄存器是波特率除數(shù)的小數(shù)部分,復(fù)位之后所有的位被清零。當(dāng)修改UARTFBRD寄存器的值時,只有在當(dāng)前字節(jié)發(fā)送/接收完成之后才會有效。波特率除數(shù)的任何改變都必須在寫UARTLCRH寄存器之后。圖2.1-44所示為UARTFBRD寄存器。UARTLCRH寄存器是線控制寄存器,可控制串口的數(shù)據(jù)長度、校驗和停止位的選擇。當(dāng)更新波特率除數(shù)寄存器時,必須也要重寫該寄存器,是因為波特率除數(shù)寄存器的寫選通信號與該寄存器是連接在一起的。圖2.1-45所示為UARTLCRH寄存器UARTCTL是控制寄存器,在復(fù)位后除發(fā)送和接收使能位外,其他位都被清零。UARTEN位用于使能UART模塊,在配置串口模塊時必須將該位清零。如果在串口進行發(fā)送或者接收的操作時關(guān)閉串口模塊功能,則在完成當(dāng)前發(fā)送或者接收操作之后才關(guān)閉。圖2.1-46所示為UARTCTL寄存器。UARTIFLS是選擇FIFO產(chǎn)生中斷閾值的寄存器,可以用其來定義FIFO的閾值,同時UARTRIS寄存器中的TXRIS和RXRIS位被觸發(fā)。產(chǎn)生中斷是基于一個發(fā)送操作超過閾值而不是等于閾值。也就是說,F(xiàn)IFO中的數(shù)據(jù)超過規(guī)定的閾值之后才會產(chǎn)生中斷。例如,如果接收的觸發(fā)閾值設(shè)置為一般(8字節(jié)),那么在串口模塊接收到第9個字節(jié)時才會產(chǎn)生中斷。因為在復(fù)位之后TXIFLSEL和RXIFLSEL位被配置,所以FIFO在接收一半時觸發(fā)中斷。圖2.1-47所示為UARTRIS寄存器。UARTIM是中斷掩碼置位/清零寄存器,讀取該寄存器則獲得當(dāng)前中斷的掩碼值。進行置位時,對應(yīng)的中斷將被發(fā)送到中斷控制器;清零操作時,則對應(yīng)的中斷不會被發(fā)送到中斷控制器。圖2.1-48所示為UARTIM寄存器。UARTRIS是源中斷狀態(tài)寄存器,可以讀取到當(dāng)前中斷源,寫操作無效。圖2.1-49所示為UARTRIS寄存器。UARTMIS是中斷掩碼狀態(tài)寄存器,可獲取對應(yīng)中斷的掩碼值,寫操作無效。圖2.1-50所示為UARTMIS寄存器。UARTICR是中斷清零寄存器,置位則對應(yīng)的中斷被清除(清除中斷源寄存器和中斷掩碼寄存器中對應(yīng)的位),清零操作無效。圖2.1-51所示為UARTICR寄存器。UARTDMACTL是DMA控制寄存器。圖2.1-52所示為UARTDMACTL寄存器。打開CC3200_Uart_Demo文件夾里的工程,將CC3200的UARTA0的波特率設(shè)置為115?200?b/s,8位數(shù)據(jù)位,1個停止位,無奇偶校驗位,代碼清單如2.1-6所示。當(dāng)串口接收到數(shù)據(jù)后,把接收到的數(shù)據(jù)再通過串口發(fā)送出去,編譯工程,打開UniFlash,把bin文件下載到CC3200板子上(具體步驟請參考GPIO小節(jié))。把“CH340G_VCC”和串口選擇的第一個“RXD”和第二個“TXD”撥碼開關(guān)均撥到“ON”。插上USB數(shù)據(jù)線接到電腦,打開串口助手,選擇串口號,波特率設(shè)置為115?200?b/s,按下板子的復(fù)位可見串口打印,如圖2.1-53所示。在發(fā)送框內(nèi)輸入瘋殼的網(wǎng)址,點擊“發(fā)送”,串口助手收到CC3200的回傳,如圖2.1-54所示。2.1.5外部中斷接口數(shù)據(jù)傳送控制方式有查詢、中斷和DMA等,其中中斷是重要的接口數(shù)據(jù)傳送控制方式。中斷控制分為全局和局部兩級,前者由NVIC控制,后者由外設(shè)控制。嵌套向量中斷控制器NVIC支持多個內(nèi)部異常和240個外部中斷。從廣義上講,異常和中斷都是暫停正在執(zhí)行的程序,轉(zhuǎn)去執(zhí)行異?;蛑袛嗵幚沓绦颍缓蠓祷卦瓉淼某绦蚶^續(xù)執(zhí)行。從狹義上講,異常由內(nèi)部事件引起,而中斷由外部硬件產(chǎn)生。異常和中斷的處理與子程序調(diào)用有相似之處,但也有下列本質(zhì)區(qū)別:①何時調(diào)用子程序是確定的,而何時產(chǎn)生異常和中斷是不確定的。子程序的起始地址由調(diào)用程序給出,而異常和中斷程序的起始地址則存放在地址表中。②子程序的執(zhí)行一般是無條件的,而異常和中斷處理程序的執(zhí)行要先使能。CC3200的NVIC具有下列特性:①確定的、快速的中斷處理,總是12個時鐘周期;②每個中斷的優(yōu)先級(0~7,0表示最高優(yōu)先級)可編程;③有3~8位優(yōu)先級配置;④動態(tài)重新分配中斷優(yōu)先級;⑤中斷優(yōu)先級分組允許選擇中斷優(yōu)先級分組和中斷子優(yōu)先級的數(shù)量;⑥中斷信號電平和邊沿檢測。本小節(jié)將使用GPIO外部中斷來實現(xiàn)按鍵的功能。每個GPIO端口的中斷功能通過7個寄存器來進行控制,這些寄存器可用來選擇中斷源、中斷優(yōu)先級和邊沿特性。當(dāng)一個或者多個GPIO輸入引起中斷時,一個單中斷信號輸出到整個GPIO端口的中斷控制器。以下三個寄存器定義了引起中斷的邊沿或檢測:①GPIOIS:GPIO中斷檢測寄存器。②GPIOIBE:GPIO中斷邊沿寄存器。③GPIOIEV:GPIO中斷時間寄存器。中斷功能通過GPIO中斷掩碼(GPIOIM)寄存器來進行使能和關(guān)閉。當(dāng)一個中斷條件產(chǎn)生時,有兩個地方可以查看中斷信號的狀態(tài):GPIO源中斷狀態(tài)(GPIORIS)寄存器和GPIO掩碼中斷狀態(tài)(GPIOMIS)寄存器。GPIORIS寄存器表示一個GPIO引腳達到了產(chǎn)生中斷的條件,但是不一定會發(fā)送給中斷控制器,而GPIOMIS寄存器只顯示可以發(fā)送給中斷控制器的中斷條件。如果是GPIO電平檢測中斷,產(chǎn)生中斷的電平信號必須保持到中斷服務(wù)的產(chǎn)生。一旦輸入的信號解除中斷產(chǎn)生的邏輯信號,對應(yīng)的GPIORIS寄存器中的源中斷寄存器位將被清零。對于GPIO邊沿檢測中斷,GPIORIS寄存器中的RIS位通過向寄存器GPIOICR中的對應(yīng)位寫入1來進行清零。GPIOMIS寄存器中的對應(yīng)位反應(yīng)源中斷狀態(tài)位的掩碼值。當(dāng)編輯中斷控制寄存器時,應(yīng)當(dāng)將中斷全部關(guān)閉(GPIOIM清零)。如果對應(yīng)的位使能的話,則寫任何中斷控制寄存器都會產(chǎn)生不必要的中斷。GPIOIS是中斷檢測寄存器。置位對應(yīng)的引腳進行電平檢測,清零則對應(yīng)的引腳進行邊沿檢測。在復(fù)位時,所有的位清零。圖2.1-55所示為其寄存器。GPIOIBE寄存器允許雙邊沿來觸發(fā)中斷。當(dāng)GPIOIS寄存器設(shè)置為檢測邊沿時,則設(shè)置GPIOIBE寄存器來配置對應(yīng)的引腳來檢測上升和下降沿,而忽略GPIOIEV寄存器中的對應(yīng)位的配置。清零一位,則配置為引腳受GPIOIEV寄存器的控制。復(fù)位之后,所有的位都被清零。圖2.1-56所示為其寄存器。GPIOIEV寄存器是中斷事件寄存器,通過置位其中對應(yīng)的位來配置對應(yīng)的引腳檢測上升沿或者高電平,這取決于GPIOIS寄存器對應(yīng)位的配置。清零該寄存器中的對應(yīng)位則對應(yīng)的引腳檢測下降沿或者低電平,取決于GPIOIS寄存器中對應(yīng)位的配置,復(fù)位之后所有的位都清零。如圖2.1-57所示為寄存器。GPIOIM寄存器是中斷掩碼寄存器,通過置位其中的對應(yīng)位,則對應(yīng)引腳上產(chǎn)生的中斷將通過組合中斷信號發(fā)送給中斷控制器。清零則對應(yīng)的引腳產(chǎn)生的中斷不會發(fā)送給中斷控制器。復(fù)位之后所有的位都清零。圖2.1-58所示為GPIOIM寄存器。GPIORIS寄存器是源中斷狀態(tài)寄存器。當(dāng)對應(yīng)的引腳達到中斷條件時,該寄存器中對應(yīng)的位被置位。如果中斷掩碼(GPIOIM)寄存器中的對應(yīng)位被置位,則發(fā)送中斷信號到中斷控制寄存器。如果某一位讀取為0,則說明對應(yīng)的引腳沒有產(chǎn)生中斷。對于電平觸發(fā)中斷,引腳上的中斷信號必須保持到中斷服務(wù)。一旦中斷信號達不到中斷邏輯檢測要求,則GPIORIS寄存器對應(yīng)的RIS位將被清零。對于一個GPIO邊沿檢測中斷,GPIORIS寄存器中的RIS位通過置位GPIOICR寄存器中對應(yīng)的位進行清零。GPIOMIS寄存器中的位反映了RIS位的掩碼值。圖2.1-59所示為GPIORIS寄存器。GPIOMIS寄存器是掩碼中斷狀態(tài)寄存器。如果寄存器中對應(yīng)位被置位,則對應(yīng)的中斷將被發(fā)送到中斷控制器。如果某一位被清零,則無論是否有中斷產(chǎn)生,中斷都會被屏蔽掉。GPIOMIS寄存器是中斷掩碼之后的狀態(tài),圖2.1-60所示為其寄存器。GPIOICR寄存器是中斷清零寄存器。對于邊沿檢測中斷,置位GPIOICR寄存器中對應(yīng)的位,則會清除GPIORIS和GPIOMIS寄存器中對應(yīng)的位。如果中斷是電平檢測,則該寄存器中的對應(yīng)位沒有影響。另外,向該寄存器中寫入0也沒有任何影響,圖2.1-61所示為其寄存器。本實驗在是官方CC3200SDK_1.2.0中Interrupt例程代碼的基礎(chǔ)上修改得來的,打開Interrupt_Demo。由于本次實驗用到串口和按鍵,所以在mian函數(shù)的PinMuxConfig()中配置了串口0的輸入、輸出,以及GPIO_13和GPIO_22的方向為輸入。本次實驗的關(guān)鍵是ButtonIntInit()函數(shù),該函數(shù)如代碼清單2.1-7所示。在該函數(shù)中把GPIO_13與GOIO_22配置為下降沿觸發(fā),觸發(fā)的中斷函數(shù)為Button1IntHandler()及Button2IntHandler()。進入中斷后首先清除標(biāo)志位,然后通過串口0打印出“Button1”及“Button2”。打開UniFlash,把編譯后生成的bin文件下載到板子上(參考GPIO小節(jié)),把串口選擇的撥碼的第一個“RXD”及“CH340G_VCC”撥到ON。這里我們用到了串口0的接收,打開串口調(diào)試助手,選擇對應(yīng)的串口號,波特率設(shè)置為115?200;打開串口,a按下復(fù)位,可以看到串口打印信息如圖2.1-62所示。按下板子上的SW2和SW3,可以看到串口打印信息如圖2.1-63所示。2.1.6PWMPWM(PulseWidthModulation)即脈沖寬度調(diào)制。PWM運用非常廣泛,大到航天飛船,小到便攜式USB風(fēng)扇,都可以見到PWM的身影。許多MCU的定時器均帶有PWM模式,CC3200也不例外。CC3200通用定時器支持PWM模式。在PWM模式下定時器被配置為一個24位的減計數(shù)器,初始值在GPTMTnILR和GPTMTnPR寄存器中進行定義。在該模式中PWM頻率和周期是同步事件,這樣可以消除毛刺。PWM模式可以通過向寄存器GPTMTnMR中的TnAMS位寫入0x01,TnCMR位寫入0x00,TnMR位寫入0x02。當(dāng)定時器使能時,裝載到定時器寄存器中的值如表2.1-46所示。當(dāng)通過軟件寫GPTMCTL寄存器中的TnEN位時,計數(shù)器開始進行減計數(shù),直到0。在周期模式中的下一個計數(shù)循環(huán),計數(shù)器從GPTMTnILR和GPTMTnPR寄存器中裝載初始值,并重新開始計數(shù),直到通過軟件清除GPTMCTL寄存器中的TnEN位進行關(guān)閉。該定時器可以通過上升沿、下降沿和邊沿觸發(fā)這3種類型的事件來產(chǎn)生中斷。事件類型通過GPTMCTL寄存器中的TnEVENT位來進行配置,中斷通過GPTMTnMR寄存器中的TnPWMIE位來進行使能。當(dāng)事件發(fā)生時GPTMRIS寄存器中的CnERIS位被置位,并且一直保持到通過GPTMICR寄存器來進行清除。如果捕獲模式事件中斷通過GPTMIMR寄存器進行使能,則通用定時器也要置位GPTMMIS寄存器中的CnEMIS位。另外,通過置位GPTMCTL寄存器中的TnOTE位和GPTMDMAEV寄存器中的CnEDMAEN位,使能DMA觸發(fā)模式。當(dāng)TnPWMIE被置位并且發(fā)生捕捉時間時,定時器自動產(chǎn)生DMA的觸發(fā)事件。在PWM模式中GPTMTnR和GPTMTnV寄存器始終保持相同的值。當(dāng)計數(shù)器的值等于GPTMTnILR和GPTMTnPR寄存器的值時,輸出PWM信號;當(dāng)計數(shù)器的值等于GPTMTnMATCHR和GPTMTnPMR寄存器的值時,信號進行翻轉(zhuǎn),可以通過軟件設(shè)置GPTMCTL寄存器中的TnPWML位來對PWM信號的電平進行翻轉(zhuǎn)。圖2.1-64就是一個產(chǎn)生PWM信號的例子。GPTMCFG寄存器配置通用定時器模塊的全局操作。確定通用定時器工作于32位模式,還是16位模式。該寄存器中的值只能是在GPTMCTL寄存器中的TAEN和TBEN兩位被清零時改變,圖2.1-65所示為其寄存器。把2~0位寫入0,配置為32位定時器模式;如寫入4,配置為16位定時器模式。GPTMTAMR寄存器的配置是基于GPTMCFG寄存器的配置來進行選擇的。在PWM模式中,置位TAAMS位、清除TACMR位和配置TAMR為0x01或者0x02。圖2.1-66所示為其寄存器。GPTMTBMR寄存器控制獨立定時器B的工作模式。當(dāng)定時器A和定時器B一起使用時該寄存器被忽略,而是通過GPTMTAMR來控制定時器A和定時器B的工作模式。注意:除了TCACT位,其他位都必須在GPTMCTL寄存器中的TBEN位清零時進行配置。圖2.1-67所示為GPTMTBMR寄存器。GPTMCTL寄存器為定時器的控制寄存器,圖2.1-68為GPTMCTL寄存器。GPTMIMR寄存器可以通過軟件使能/關(guān)閉定時器的控制電平中斷。置位可以打開對應(yīng)的中斷,清零可以關(guān)閉對應(yīng)的中斷,圖2.1-69所示為GPTMIMR寄存器。GPTMRIS寄存器為中斷源狀態(tài)寄存器,通過該寄存器可以獲取中斷源。圖2.1-70為GPTMRIS寄存器。GPTMMIS寄存器為中斷掩碼狀態(tài)寄存器,可以檢測是否產(chǎn)生中斷。圖2.1-71所示為GPTMMIS寄存器。GPTMICR寄存器用于清除GPTMRIS和GPTMIS寄存器中的狀態(tài)位,寫入1則清除對應(yīng)的中斷。圖2.1-72所示為GPTMICR寄存器。當(dāng)通用定時器被配置為32位模式,GPTMTAILR作為一個32位寄存器(高16位對應(yīng)與定時器B裝載值寄存器的內(nèi)容)。在16位模式中寄存器的高16位讀取值為0,并且對GPTMTBILR寄存器的狀態(tài)沒有影響。圖2.1-73所示為GPTMTAILR寄存器。當(dāng)通用定時器配置為32位模式時,GPTMTBILR寄存器中[15:0]位的內(nèi)容被裝載到GPTMTAILR寄存器的高16位。讀取GPTMTBILR寄存器,則返回定時器B的當(dāng)前值,寫操作無效。在16位模式,[15:0]位用于裝載值,[31:16]位保留不使用。圖2.1-74所示為GPTMTBILR寄存器。當(dāng)通用定時器被配置為32位模式時,GPTMTAMATCHR作為32位寄存器(高16位對應(yīng)于GPTMTBMATCHR寄存器的內(nèi)容)。在16位模式,寄存器的高16位讀取為0,并且對GPTMTBMATCHR的狀態(tài)沒有影響。圖2.1-75所示為GPTMTAMATCHR寄存器。當(dāng)通用定時器配置為32位模式時,GPTMTBMATCHR寄存器的[15:0]位被裝載到寄存器GPTMTAMATCHR寄存器的高16位。讀取GPTMTBMATCHR寄存器得到定時器B的當(dāng)前值,寫操作無效。在16位模式中,[15:0]位用于匹配值。[31:16]位保留不使用。圖2.1-76所示為GPTMTBMATCHR寄存器。GPTMTAPR寄存器通過軟件來擴展獨立定時器的范圍。在單次或者周期減計數(shù)模式下該寄存器作為定時計數(shù)器的預(yù)分頻器。圖2.1-77所示為GPTMTAPR寄存器。GPTMTBPR寄存器通過軟件來擴展獨立定時器的范圍,在單次或者周期減計數(shù)模式下該寄存器作為定時計數(shù)器的預(yù)分頻器。圖2.1-78所示為GPTMTBPR寄存器。GPTMTAPMR寄存器擴展獨立定時器GPTMTAMATCHR的范圍。當(dāng)寄存器工作于16位模式時,該寄存器表示[23:16]位。圖2.1-79所示為GPTMTAPMR寄存器。GPTMTBPMR寄存器擴展獨立定時器GPTMTAMATCHR的范圍。當(dāng)寄存器工作于16位模式時,該寄存器表示[23:16]位。圖2.1-80所示為GPTMTBPMR寄存器。當(dāng)定時器配置為32位模式時,GPTMTAR作為32位寄存器使用(高16位對應(yīng)GPTMTBR寄存器的內(nèi)容)。在16位輸入邊沿計數(shù),輸入邊沿定時和PEM模式,[15:0]位包含計數(shù)器的值,[23:16]位包含預(yù)分頻高8位的值。[31:24]位讀取值始終為0。可以讀取[GPTMTAV]的[23:16]位來獲取16位模式單次和周期模式的預(yù)分頻值。讀取GPTMTAPS寄存器可以獲取定期快照模式下的預(yù)分頻值。圖2.1-81所示為GPTMTAR寄存器。當(dāng)通用定時器配置為32位模式時,GPTMTBR寄存器的[15:0]位被裝載到GPTMTAR寄存器的高16位。讀取GPTMTBR寄存器得到定時器B的當(dāng)前值。在16位模式下[15:0]位包含計數(shù)器的值,[23:16]位包含在輸入邊沿計數(shù)、邊沿定時和PWM模式下的預(yù)分頻。[31:24]位讀取為0??梢酝ㄟ^讀取GPTMTBV寄存器中的[23:16]位可以獲取16位單次和周期模式的預(yù)分頻值。讀取GPTMTBPS寄存器可以獲取周期快照模式下的預(yù)分頻。圖2.1-82所示為GPTMTBR寄存器。當(dāng)定時器配置為32位模式時,GPTMTAV作為32位寄存器(高16位對應(yīng)GPTMTBV寄存器的內(nèi)容)。在16位模式,[15:0]位包含計數(shù)器的值,[23:16]位包含分頻值。在單次或周期減計數(shù)模式,[23:16]位存儲真實的預(yù)分頻值,意味著在減[15:0]位的值之前,先減[23:16]位的值,[31:24]位讀取始終為0。圖2.1-83所示為GPTMTAV寄存器。當(dāng)通用定時器配置為32位模式,GPTMTBV寄存器[15:0]位的值被裝載到GPTMTAV寄存器的高16位。讀取GPTMTBV寄存器,則返回定時器B的當(dāng)前值。在16位模式,[15:0]位包含計數(shù)器的值,[23:16]位包含當(dāng)前的預(yù)分頻值。在單次或周期模式,[23:16]位為真實的預(yù)分頻值,意味著在[15:0]位減數(shù)之前,[23:16]位先進行減數(shù)。[31:24]位讀取值為0。圖2.1-84所示為GPTMTAV寄存器。GPTMDMAEV寄存器允許軟件使能和關(guān)閉定時器DMA觸發(fā)事件。置位對應(yīng)的DMA觸發(fā)使能,清零則關(guān)閉。圖2.1-85所示為GPTMDMAEV寄存器。打開Pwm_Demo,在該次工程中主要是實現(xiàn)板子上三顆LED的“呼吸燈”效果,即要把GPIO_9、GPIO_10和GPIO_11三個IO口配置為PWM模式,逐次增加或降低這些端口的占空比即可使LED“呼吸”,如代碼清單2.1-8為Pwm_Demo的main函數(shù)。首先,看到main函數(shù)中的PinMuxConfig()函數(shù),如代碼清單2.1-9所示為該函數(shù)的代碼。在該代碼中先使能時鐘,然后把Pin64(GPIO_9)、Pin01(GPIO_10)及Pin02(GPIO11)分別配置為模式3,即PWM模式。為什么呢?在datasheet中可以里看到,如圖2.1-86以及圖2.1-87所示的端口復(fù)用圖,在該圖中可以看到Pin64(GPIO_9)在模式3下會被復(fù)用為PWM_05,Pin01(GPIO_10)在模式3下會被復(fù)用為PWM_06,Pin02(GPIO_11)在模式3下會被復(fù)用為PWM_07。配置好PWM輸出引腳后,就將定時器與該輸出引腳相關(guān)聯(lián)起來,在main函數(shù)中的InitPWMModules()函數(shù)是關(guān)鍵,如代碼清單2.1-10為InitPWMModules()函數(shù)。在該函數(shù)中的SetupTimerPWMMode()把Timer2的TimerB與PWM_5(即GPIO_9)相關(guān)聯(lián)起來,把Timer3的TimerB與PWM_6(即GPIO_10)相關(guān)聯(lián)起來,把Timer3的TimerA與PWM_7(即GPIO_11)相關(guān)聯(lián)起來。問題來了,為什么這樣就能關(guān)聯(lián)起來了呢?打開CC3200的《TechnicalReferenceManual》,即常說的參考手冊,可以看到一個定時器與引腳映射圖,如圖2.1-88所示。在該圖中可以清楚地看到,PWM_5正是對應(yīng)著Timer2的TimerB,PWM_6正是對應(yīng)著Timer3的TimerA,PWM_7正是對應(yīng)著Timer3的TimerB。返回到main函數(shù)中,實現(xiàn)LED呼吸的部分代碼,如代碼清單2.1-11所示。該代碼主要就是不斷地改變輸出端的占空比,從而實現(xiàn)LED的“呼吸”。編譯代碼時打開UniFlash,把Bin文件下載到板子上(參考GPIO小節(jié)),再把撥碼開關(guān)D5、D6、D7撥到“ON”,按下復(fù)位,可以看到如圖2.1-89所示的LED“呼吸”效果。2.1.7WiFi-UDP網(wǎng)絡(luò)通信UDP是UserDatagramProtocol的簡稱,中文名是用戶數(shù)據(jù)報協(xié)議。在網(wǎng)絡(luò)中UDP與TCP協(xié)議一樣,用于處理數(shù)據(jù)包。與TCP不一樣的是,UDP是一種無連接的協(xié)議,只能是盡可能地傳輸?shù)侥康牡?,所以UDP也是具有一定的不可靠性。那么為什么還會存在UDP呢?因為在早期的網(wǎng)絡(luò)開發(fā)中,人們發(fā)現(xiàn)一些簡單的網(wǎng)絡(luò)通信不需要經(jīng)過TCP復(fù)雜的建立關(guān)系,而且過多的建立TCP連接會造成很大的網(wǎng)絡(luò)負擔(dān),而UDP協(xié)議可以相對快速地處理這些簡單通信,如表2.1-68所示為UDP組成結(jié)構(gòu)。CC3200支持多種基于WiFi的網(wǎng)絡(luò)通信,UDP也不例外。打開Udp_Socket_Demo,如代碼清單2.1-12所示為main函數(shù)。在main函數(shù)中有InitializeAppVariables,該函數(shù)主要在于實現(xiàn)把宏定義中的UDP服務(wù)器的IP及端口號取出,進入建立UDP的就緒狀態(tài)。ConfigureSimpleLinkToDefaultState()函數(shù)主要是實現(xiàn)CC3200的接入網(wǎng)絡(luò)部分,把CC3200設(shè)置為STA模式,并且把CC3200接入到在common.h中定義好的路由器上,如代碼清單2.1-13所示為common.h中定義好的路由器SSID、密鑰及加密方式等。最重要的函數(shù)是如代碼清單2.1-14所示的BsdUdpClient(),通過該函數(shù)建立UDP。該函數(shù)先通過函數(shù)sl_SendTo()向網(wǎng)絡(luò)中發(fā)送瘋殼的官網(wǎng),然后通過函數(shù)sl_RecvFrom()進入等待接收。打開網(wǎng)絡(luò)調(diào)試助手,然后點擊“打開”,將協(xié)議類型設(shè)置為“UDP”,點擊“打開”。把網(wǎng)絡(luò)調(diào)試助手的“本地主機地址”和“本地主機端口”,填寫到程序中定義IP及端口號處,如代碼清單2.1-15所示(注意IP要為16進制),如圖2.1-90所示為網(wǎng)絡(luò)調(diào)試助手打開時的畫面。編譯代碼,打開UniFlash,下載bin文件到板子上(下載方法參考GPIO小節(jié))。下載完成后打開UARTA0的“RXD”,并將“CH340G_VCC”(即撥碼開關(guān))撥到“ON”。打開串口調(diào)試助手,選擇相應(yīng)的串口號,并且把波特率設(shè)置為115?200?b/s,點擊“打開”。按下板子上的復(fù)位鍵,可看到串口助手打印如圖2.1-91所示的信息。由此可見,CC3200已經(jīng)連接上了指定的路由器,并通過UDP發(fā)送了一段消息。此時網(wǎng)絡(luò)調(diào)試助手也收到CC3200發(fā)來的信息,并自動獲取IP等信息,如圖2.1-92所示。在網(wǎng)絡(luò)調(diào)試助手中輸入一串信息,點擊“發(fā)送”,如圖2.1-93所示。此時,串口調(diào)試助手也把CC3200收到的信息打印出來,并發(fā)送一串新的信息,如圖2.1-94所示。2.1.8WiFi-TCP網(wǎng)絡(luò)通信傳輸控制協(xié)議(TransmissionControlProtocol,TCP)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。TCP與UDP的主要區(qū)別如表2.1-69所示。此外,TCP與UDP的組成結(jié)構(gòu)也不一樣,其中TCP的組成結(jié)構(gòu)如表2.1-70所示。打開Tcp_Socket_Demo,如代碼清單2.1-16所示為main函數(shù)。與WiFi-UDP小節(jié)類似,通過ConfigureSimpleLinkToDefaultState()配置CC3200為STA模式,然后再通過WlanConnect()接入到Common.h中定義的路由器,如代碼清單2.1-17所示。最后,通過BsdTcpClient()函數(shù)向TCP服務(wù)器發(fā)送信息及接收服務(wù)器端發(fā)來的信息。打開網(wǎng)絡(luò)調(diào)試助手,然后點擊“打開”,設(shè)置協(xié)議類型為“TCPServer”,點擊“打開”。把網(wǎng)絡(luò)調(diào)試助手的“本地主機地址”和“本地主機端口”填寫到程序中定義IP及端口號處,如代碼清單2.1-18所示(注意IP要為16進制)。圖2.1-95所示為網(wǎng)絡(luò)調(diào)試助手打開時的界面。編譯代碼,打開UniFlash,下載bin文件到板子上(下載方法參考GPIO小節(jié))。下載完成后打開UARTA0的“RXD”,并將“CH340G_VCC”(即撥碼開關(guān))撥到“ON”。打開串口調(diào)試助手,選擇相應(yīng)的串口號,并且把波特率設(shè)置為115?200?b/s,點擊“打開”。按下板子上的復(fù)位鍵,可看到串口助手打印如圖2.1-96所示的信息。由此可見,CC3200已經(jīng)連接到指定的路由器上,并通過TCP發(fā)送了一段消息。此刻網(wǎng)絡(luò)調(diào)試助手也收到CC3200發(fā)來的信息,并自動獲取到IP等信息,如圖2.1-97所示。在網(wǎng)絡(luò)調(diào)試助手中輸入一串信息,點擊“發(fā)送”,如圖2.1-98所示。此時,串口調(diào)試助手也把CC3200收到的信息打印出來,并且發(fā)送一串新的信息,如圖2.1-99所示。2.2軟件開發(fā)基礎(chǔ)2.2.1Java簡介1.?Java的概念Java是一種跨平臺的、高級的、面向?qū)ο蟮某绦蛟O(shè)計語言。2.?JVM(JavaVirtualMachine,Java虛擬機)JVM(JavaVirtualMachine,Java虛擬機)是Java程序跨平臺的關(guān)鍵,不同的平臺有不同的JVM,而Java字節(jié)碼不包含任何與平臺相關(guān)的信息,不直接與平臺交互,而是通過JVM間接地與平臺交互。應(yīng)用程序在執(zhí)行時JVM加載字節(jié)碼,將字節(jié)碼解釋成特定平臺的機器碼,讓平臺執(zhí)行。任何一個應(yīng)用程序都必須轉(zhuǎn)化為機器碼,才能與計算機進行交互。如果機器碼的來源依賴于具體的平臺,那么這個應(yīng)用程序就不能跨平臺。而在Java應(yīng)用程序運行時機器碼由Java體系的一部分JVM提供,不受平臺的限制,故而實現(xiàn)了跨平臺。3.?Java程序運行過程程序員編寫的源碼經(jīng)編譯器編譯轉(zhuǎn)化為字節(jié)碼,生成的字節(jié)碼被加載到JVM,由JVM解釋成機器碼,并在計算機上運行,如圖2.2-1所示。4.?Java特性Java的主要特性有:(1)簡單:Java語言是從C++?發(fā)展起來的,取消了C++?中復(fù)雜而難以掌握的部分,如指針。(2)面向?qū)ο螅篔ava語言的基礎(chǔ)是Java將一切問題都看作對象與對象之間的交互,將對象抽象成方法與屬性的集合。(3)分布性:包含操作分布性與數(shù)據(jù)分布性兩方面。操作分布性是指由多個主機共同完成一項功能,而數(shù)據(jù)分布性則是指分布在多臺主機上的數(shù)據(jù)被當(dāng)作一個完成的整體處理。(4)跨平臺:Java語言編寫的應(yīng)用程序不受平臺限制,可以由一種平臺遷移到另一種平臺。(5)解釋型:使用Java語言編寫的源碼被轉(zhuǎn)化為字節(jié)碼,而字節(jié)碼只有被JVM解釋成機器碼才能被計算機執(zhí)行。(6)??安全性:Java語言的底層設(shè)計可以有效地避免非法操作。(7)健壯性:Java提供了許多機制來防止運行時出現(xiàn)的嚴重錯誤,如編譯時類型檢查、異常處理。(8)多線程:Java支持多線程,允許進程內(nèi)部多個線程同時工作。5.?Java中的一些基本概念(1)類(class):代表了一些具有某些共同特征的對象的抽象。(2)屬性(特征)的定義格式:訪問權(quán)限類型屬性名。(3)方法(行為)的定義格式:訪問權(quán)限返回類型方法名(參數(shù)列表){}。(4)創(chuàng)建對象的格式:類名對象名?=?new類名()。(5)調(diào)用屬性:對象名.屬性名。(6)調(diào)用方法:對象名.方法名(參數(shù))。(7)包(package):代表類的存放路徑。(8)引入(import):有一些類的功能需要用到其他類,就需要使用import將其他類引入進來。(9)項目(project):可以理解為很多類的一個集合,共同對外提供一個或多個完整的功能。示例代碼段見代碼清單2.2-1所示。編寫第一個Java程序時,首先打開Eclipse(如果出現(xiàn)歡迎頁面,則關(guān)掉此頁面),單擊右上角File-new-JavaProject,進入新建項目對話框,填寫項目名稱,選擇運行環(huán)境,然后點擊“完成”,這樣一個Java項目就創(chuàng)建好了,如圖2.2-2所示。這是創(chuàng)建好的項目目錄結(jié)構(gòu),上面的JRESystemLibrary里存放的是程序運行所必需依賴的環(huán)境(即所安裝的JRE),不必去管它。下面的src目錄就是我們真正編寫自己代碼的地方,如圖2.2-3所示。鼠標(biāo)右鍵單擊src-New-Class,進入新建Java類對話框,填寫好包名(也可不填)和類名,點擊“完成”,這樣一個Java類就新建好了,如圖2.2-4所示?,F(xiàn)在,我們就要開始寫自己的代碼了。程序要想運行必須要有一個入口方法main,我們就來寫一個main方法。我們的目的只是在eclipse上成功運行一個Java程序,那么第一個Java程序就在控制臺輸入“Hello,World!”。需要書寫的main方法代碼,如代碼清單2.2-2所示。運行結(jié)果,如圖2.2-5所示。Gradle是一個基于ApacheAnt和ApacheMavenJava的項目管理工具,JDK提供給我們的一些原生的基礎(chǔ)類庫,其功能簡單、有限。如果我們使用這些基礎(chǔ)類庫去開發(fā)一些功能復(fù)雜的應(yīng)用,將會非常費時、費力,不過好在我們可以通過依賴第三方開發(fā)的jar包來使用第三方開發(fā)好的功能。一個大型的項目可以引用到多個jar包,各個jar包之間又有可能存在著互相依賴。由于它們之間的關(guān)系錯綜復(fù)雜,所以我們使用了項目自動化構(gòu)建工具Gradle來管理項目,它會自動幫助我們處理這些依賴關(guān)系,并節(jié)省大量時間。Gradle的項目自動化建構(gòu)工具,是使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項目設(shè)置,拋棄了基于XML的各種繁瑣配置。以面向Java應(yīng)用為主,當(dāng)前其支持的語言限于Java、Groovy和Scala,計劃未來將支持更多的語言。Gradle的主要功能如下:①按約定聲明構(gòu)建和建設(shè);②強大地支持多工程的構(gòu)建;③強大的依賴管理(基于ApacheIvy),提供最大的便利去構(gòu)建工程;④全面支持已有的Maven或Ivy倉庫的基礎(chǔ)建設(shè);⑤在不需要遠程倉庫、pom.xml和ivy配置文件的前提下支持傳遞性依賴管理;⑥基于Groovy腳本構(gòu)建,其build腳本使用Groovy語言編寫;⑦具有廣泛的領(lǐng)域模型支持構(gòu)建;⑧深度API;⑨易遷移。自由和開放源碼,Gradle是一個開源項目,基于ASL許可。本書涉及的源碼大多數(shù)都是Gradle項目,需要按照以下步驟將項目導(dǎo)入eclipse中。下面以geek_intelligent項目為例加以說明。(1)打開eclipse,鼠標(biāo)右鍵單擊左邊欄空白區(qū)域,選擇“Import”,彈出導(dǎo)入項目對話框,然后把默認的勾選去掉,點擊“Next”,如圖2.2-6所示。(2)選擇項目存在的文件夾,點擊“Finish”,如圖2.2-7所示。eclipse右下角會提示正在導(dǎo)入,導(dǎo)入完成后我們會發(fā)現(xiàn)eclipse中多了一個項目,這是新項目的目錄結(jié)構(gòu)。(3)如果在打開Java文件中發(fā)現(xiàn)里面的中文是亂碼的話,就需要更改項目的編碼集。鼠標(biāo)右鍵單擊項目→Properties,彈出項目屬性對話框,點擊“Resource”,“Textfileencoding”,選擇“Other”,下拉框選擇“UTF-8”,點擊“ApplyandClose”,現(xiàn)在中文就能正常顯示,如圖2.2-9所示。2.2.2網(wǎng)絡(luò)協(xié)議基礎(chǔ)網(wǎng)絡(luò)協(xié)議是計算機網(wǎng)絡(luò)中進行數(shù)據(jù)交換而建立的規(guī)則、標(biāo)準(zhǔn)或約定的集合,計算機之間想要交換數(shù)據(jù)就必須遵守相同的協(xié)議。而在網(wǎng)絡(luò)中為了完成通信,必須使用多層上的多種協(xié)議。這些協(xié)議按照層次順序組合在一起,構(gòu)成了協(xié)議棧(ProtocolStack),也稱為協(xié)議族(ProtocolSuite)。目前國際互聯(lián)網(wǎng)遵循的是TCP/IP協(xié)議組。TCP/IP是個協(xié)議組,可分為四個層次,從下到上依次是鏈路層(網(wǎng)絡(luò)接口層)、網(wǎng)絡(luò)層(互聯(lián)網(wǎng)層)、運輸層(傳輸層)和應(yīng)用層。鏈路層有ARP、RARP、PPP等協(xié)議,網(wǎng)絡(luò)層有IP、ICMP、ARP、RARP、BOOTP等協(xié)議,運輸層有TCP與UDP等協(xié)議,應(yīng)用層有FTP、HTTP、TELNET、SMTP、DNS等協(xié)議,如圖2.2-10所示。下面重點介紹我們最常接觸到的幾種通信協(xié)議:HTTP、TCP與UDP協(xié)議。1.HTTP協(xié)議HTTP(HyperTextTransferProtocol,超文本傳輸協(xié)議)是一種建立在請求/響應(yīng)模型上的通信協(xié)議。首先,由客戶建立一條與服務(wù)器的TCP連接,并發(fā)送一個請求到服務(wù)器,請求中包含請求方法、URI、協(xié)議版本及相關(guān)的MIME樣式消息等內(nèi)容。服務(wù)器響應(yīng)一個狀態(tài)行,包含消息的協(xié)議版本、一個成功和失敗碼,以及相關(guān)的MIME樣式消息等內(nèi)容。HTTP/1.0為每一次HTTP的請求/響應(yīng)建立一條新的TCP鏈接,因此一個包含HTML內(nèi)容和圖片的頁面將需要建立多次的、短期的TCP連接。一次TCP鏈接的建立,將需要3次握手。另外,為了獲得適當(dāng)?shù)膫鬏斔俣?,則需要TCP花費額外的回路連接時間(RTT)。每一次連接的建立需要這種經(jīng)常性的開銷,而其并不帶有實際有用的數(shù)據(jù),只是保證連接的可靠性,因此HTTP/1.1提出了可持續(xù)連接的實現(xiàn)方法。HTTP/1.1將只建立一次TCP的連接而重復(fù)地使用其傳輸一系列的請求/響應(yīng)消息,因此減少了連接建立的次數(shù)和經(jīng)常性的連接開銷。雖然HTTP本身是一個協(xié)議,但其最終還是基于TCP的。不過,目前有人正在研究基于TCP+UDP混合的HTTP協(xié)議。在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)組件的尋址對信息的路由選擇和傳輸來說是相當(dāng)關(guān)鍵的。相同網(wǎng)絡(luò)中的兩臺機器間的消息傳輸有各自的技術(shù)協(xié)定。LAN是通過提供6字節(jié)的唯一標(biāo)識符(“MAC”地址)在機器間發(fā)送消息的。SNA網(wǎng)絡(luò)中的每臺機器都有一個邏輯單元及與其相應(yīng)的網(wǎng)絡(luò)地址。DECNET、AppleTalk和NovellIPX均有一個用來分配編號到各個本地網(wǎng)和工作站的配置。HTTP是超文本傳輸協(xié)議,是客戶端瀏覽器或其他程序與Web服務(wù)器之間的應(yīng)用層通信協(xié)議。在Internet上的Web服務(wù)器上存放的都是超文本信息,客戶機需要通過HTTP協(xié)議傳輸所要訪問的超文本信息。HTTP包含命令和傳輸信息,不僅可用于Web訪問,也可用于其他因特網(wǎng)/內(nèi)聯(lián)網(wǎng)應(yīng)用系統(tǒng)之間的通信,從而實現(xiàn)各類應(yīng)用資源超媒體訪問的集成。2.TCP與UDP協(xié)議TCP與UDP協(xié)議是網(wǎng)絡(luò)通信中最常見的協(xié)議,兩者的區(qū)別如下:1)面向連接的TCP“面向連接”就是在正式通信前必須要與對方建立起連接。TCP(TransmissionControlProtocol,傳輸控制協(xié)議)是基于連接的協(xié)議。也就是說,在正式收發(fā)數(shù)據(jù)前必須與對方建立可靠的連接。一個TCP鏈接必須要經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜,這里僅做簡單、形象的介紹,讀者只要理解這個過程即可。這三次對話的簡單過程為:①主機A向主機B發(fā)出連接請求數(shù)據(jù)包,這是第一次對話;②主機B向主機A發(fā)送同意連接和要求同步(同步就是兩臺主機一個在發(fā)送,一個在接收,二者協(xié)調(diào)工作)的數(shù)據(jù)包,這是第二次對話;③主機A再次發(fā)出一個數(shù)據(jù)包,確認主機B的要求同步,這是第三次對話。上述三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過三次“對話”之后主機A才向主機B正式發(fā)送數(shù)據(jù)。TCP協(xié)議能為應(yīng)用程序提供可靠的通信連接,使一臺計算機發(fā)出的字節(jié)流無差錯地發(fā)往網(wǎng)絡(luò)上的其他計算機,對可靠性要求高的數(shù)據(jù)通信系統(tǒng)往往使用TCP協(xié)議傳輸數(shù)據(jù)。我們來做一個實驗,用計算機A從“網(wǎng)上鄰居”上的一臺計算機B拷貝大小分別為8644608B的文件,通過狀態(tài)欄右下角網(wǎng)卡的發(fā)送和接收指標(biāo)就會發(fā)現(xiàn)。雖然數(shù)據(jù)流是由計算機B流向計算機A的,但是計算機A仍發(fā)送了3456個數(shù)據(jù)包。這些數(shù)據(jù)包是怎樣產(chǎn)生的呢?因為文件傳輸時使用了TCP協(xié)議,更確切地說是使用了面向連接的TCP協(xié)議,計算機A接收數(shù)據(jù)包時要向計算機B回發(fā)數(shù)據(jù)包,也產(chǎn)生了一些通信量。如果事先用網(wǎng)絡(luò)監(jiān)視器監(jiān)視網(wǎng)絡(luò)流量,就會發(fā)現(xiàn)由此產(chǎn)生的數(shù)據(jù)流量分別是9478819B,比文件大小多出10.96%。原因不僅在于數(shù)據(jù)包和幀本身占用了一些空間,還在于TCP協(xié)議面向連接的特性導(dǎo)致了一些額外的通信量產(chǎn)生。2)面向非連接的UDP協(xié)議“面向非連接”就是在正式通信前不必與對方先建立連接,不管對方狀態(tài)就直接發(fā)送。這與現(xiàn)在所用的手機短信非常相似:你在發(fā)短信的時候,只需要輸入對方手機號就OK了。用戶數(shù)據(jù)報協(xié)議(UserDataProtocol,UDP)是與TCP相對應(yīng)的協(xié)議,是面向非連接的協(xié)議。它不與對方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去。UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應(yīng)用環(huán)境。UDP協(xié)議是面向非連接的協(xié)議,沒有建立連接的過程。正因為UDP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因為如此,它的可靠性不如TCP協(xié)議高。QQ就使用UDP發(fā)消息,因此有時會出現(xiàn)收不到消息的情況。2.2.3Netty基礎(chǔ)Netty是一個基于NIO(non-blockingI/O,非阻塞式I/O)的客戶、服務(wù)器端編程框架,使用Netty可以確??焖?、簡單地開發(fā)出一個網(wǎng)絡(luò)應(yīng)用,如實現(xiàn)了某種協(xié)議的客戶端和服務(wù)端應(yīng)用。Netty相當(dāng)于簡化和流水線化了的網(wǎng)絡(luò)應(yīng)用編程開發(fā)過程,如基于TCP和UDP的socket服務(wù)開發(fā)。Netty是用Java編寫的一個組件,幫我們完成搭建一個基于TCP或者UDP等協(xié)議的網(wǎng)絡(luò)服務(wù)器的大部分功能,只需要關(guān)注自定義的數(shù)據(jù)處理部分代碼,其余部分由Netty幫助完成。下面以建立大小寫轉(zhuǎn)換服務(wù)器為例介紹Netty。1.?Netty工作流程(服務(wù)端)我們需要使用Netty編寫一個網(wǎng)絡(luò)服務(wù)器。何為網(wǎng)絡(luò)服務(wù)器呢?大致就是接受請求數(shù)據(jù)—處理請求數(shù)據(jù)—處理響應(yīng)數(shù)據(jù)—返回響應(yīng)數(shù)據(jù)的一個過程,其中接受請求數(shù)據(jù)和返回響應(yīng)數(shù)據(jù)的工作Netty已經(jīng)幫我們做好了,只需要做的就是按照Netty規(guī)定的流程來處理請求數(shù)據(jù)。Netty處理請求的類稱為Handler(處理器),包括進站處理器(InBoundHandler)和出站處理器(OutBoundHandle)兩種。數(shù)據(jù)處理流程如圖2.2-11所示。現(xiàn)在,我們就使用Netty來建立一個實現(xiàn)字母轉(zhuǎn)換為大寫的服務(wù)器的例子。在這個例子中我們使用了UDP和TCP兩種傳輸協(xié)議,來分別實現(xiàn)功能。UDP服務(wù)核心代碼如代碼清單2.2-3所示。UDP是以DatagramPacket(數(shù)據(jù)報)來傳輸數(shù)據(jù)的,數(shù)據(jù)報中除了實際傳輸?shù)臄?shù)據(jù)內(nèi)容外,還含有發(fā)送者的信息(IP、端口等)和接收者的信息等,而我們回傳數(shù)據(jù)的接收者信息就是使用的原包發(fā)送者信息。2.?UDP服務(wù)實驗現(xiàn)象導(dǎo)入testNetty項目,在src/main/Java目錄com.fengke.Ai包下,找到UpcaseUDPServer類,運行main方法,如圖2.2-12所示。打開socket,上邊菜單欄選擇客戶端,服務(wù)器地址填入“(本機IP地址)”,端口填寫程序里面設(shè)置的端口(9091),點擊“UDP通道”,數(shù)據(jù)0隨便填寫一段小寫字母,點擊右邊的“發(fā)送”,收發(fā)記錄里面應(yīng)該就多出了一對記錄,分別是發(fā)送的數(shù)據(jù)和接收的數(shù)據(jù),如圖2.2-13所示。3.?TCP服務(wù)核心代碼為了讓大家更加深入地了解Netty原理,TCP傳輸?shù)腄EMO使用了以下兩個處理器(handler):1)?Byte2Str(1)?Decode方法:將接收的字節(jié)數(shù)組轉(zhuǎn)換為字符串。(2)?Encode方法:將回傳的字符串轉(zhuǎn)換為字節(jié)數(shù)組。2)?Str2Upcase(1)?Decode方法:將接收到的字符串轉(zhuǎn)換為大寫。(2)?Encode方法:直接回傳接收到的字符串。具體的數(shù)據(jù)流動如圖2.2-14所示。具體如代碼清單2.2-4所示。String轉(zhuǎn)換為大寫的代碼如代碼清單2.2-5所示。4.?TCP服務(wù)實驗現(xiàn)象在src/main/Java目錄com.fengke.Ai包下,找到UpcaseTCPServer類,運行main方法,如圖2.2-15所示。再次打開sokit,菜單欄選擇客戶端,服務(wù)器地址入“(本機IP地址)”,端口填寫程序里面設(shè)置的端口(9090),點擊“TCP通道”,數(shù)據(jù)0隨便填寫一段小寫字母,點擊右邊的“發(fā)送”,收發(fā)記錄里面應(yīng)該就多出了一對記錄,分別是發(fā)送的數(shù)據(jù)和接收的數(shù)據(jù),如圖2.2-16所示。2.2.4HttpClient基礎(chǔ)httpClient就是在Java程序中使用HTTP協(xié)議進行網(wǎng)絡(luò)訪問的客戶端,越來越多的Java應(yīng)用程序需要直接通過HTTP協(xié)議來訪問網(wǎng)絡(luò)資源。HttpClient是ApacheJakartaCommon下的子項目,用來提供最新的、高效的、功能豐富的、支持HTTP協(xié)議的客戶端編程工具包,并且能支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項目中,比如ApacheJakarta上很著名的兩個開源項目(Cactus和HTMLUnit)都使用了HttpClient。本書實例所使用的第三方AI算法服務(wù)器為百度云提供,使用HTTP接口進行通信。如果想實現(xiàn)后續(xù)的實驗現(xiàn)象,我們需要創(chuàng)建一個百度云AI應(yīng)用。創(chuàng)建流程如下:(1)進入百度AI語音識別頁面“/tech/speech”,點擊“立即使用”,然后登錄,點擊“創(chuàng)建應(yīng)用”,如圖2.2-17所示。(2)填寫應(yīng)用信息及需要使用的功能,語音識別功能百度已經(jīng)為我們默認勾選上了,再把人臉識別的功能也勾選上,以備后面使用,如圖2.2-18所示。(3)創(chuàng)建完成后,點擊“返回應(yīng)用列表”,就可以看到AppID、APIKey、SecretKey,先把這些信息保存一份到電腦中,如圖2.2-19所示。2.2.5數(shù)據(jù)的存儲形式數(shù)據(jù)在計算機中以二進制形式進行存儲,進制也就是進位制,是人們規(guī)定的一種進位方法。對于任何一種進制,X進制就表示某一位置上的數(shù)運算時是逢X進一位,即十進制是逢十進一、十六進制是逢十六進一、二進制就是逢二進一。在采用進位計數(shù)的數(shù)字系統(tǒng)中,如果只用r個基本符號表示數(shù)值,則稱為r進制(Radix-rNumberSystem),其中r稱為該數(shù)制的基數(shù)(Radix)。不同數(shù)制的共同特點如下:(1)每一種數(shù)制都有篤定的符號集。

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論