以
無(wú)線模組公司遠(yuǎn)距離WiFi模組為核心的無(wú)線數(shù)據(jù)采集系統(tǒng)設(shè)計(jì),無(wú)線電數(shù)據(jù)采集是現(xiàn)代信息通信研究的重要內(nèi)容。對(duì)于許多領(lǐng)域,如人難以到達(dá)的偏遠(yuǎn)環(huán)境、高腐蝕和對(duì)現(xiàn)場(chǎng)無(wú)法可循的有線連接環(huán)境,選擇有線數(shù)據(jù)采集傳輸系統(tǒng)顯然已無(wú)法滿足數(shù)據(jù)采集和傳輸?shù)男枰_@種無(wú)線數(shù)據(jù)采集方式已成為一種有效的替代方法,它作為現(xiàn)代數(shù)據(jù)監(jiān)測(cè)控制的基礎(chǔ)技術(shù),已被越來(lái)越多地應(yīng)用于物聯(lián)網(wǎng)、工業(yè)控制、環(huán)境監(jiān)測(cè)等領(lǐng)域。CV520是系統(tǒng)級(jí)芯片,它結(jié)合了Wifi功能,以CV520強(qiáng)大的處理能力、低功耗和高速穩(wěn)定的Wifi通訊等為特征。采用CV520主控芯片設(shè)計(jì)一套無(wú)線數(shù)據(jù)采集系統(tǒng),采用CV520連接芯片S進(jìn)行數(shù)據(jù)采集,并用無(wú)線模組公司遠(yuǎn)距離WiFi模組連接指定網(wǎng)絡(luò),利用Socket接口與上位機(jī)通信,將采集到的數(shù)據(jù)傳送到上位計(jì)算機(jī)系統(tǒng)。
該無(wú)線數(shù)據(jù)采集系統(tǒng)的硬件結(jié)構(gòu)主要由數(shù)據(jù)源模塊、CV520模塊和上位機(jī)三部分組成。通過SPI接口連接CV520和數(shù)據(jù)源模塊,CV520模塊在本設(shè)計(jì)中稱為SPISlave(被動(dòng)SPI設(shè)備),SPIActivity(SPIActivity);CV520通過AP(無(wú)線接入點(diǎn));建立以太網(wǎng)絡(luò)與主機(jī)連接。在系統(tǒng)運(yùn)行過程中,數(shù)據(jù)源模塊定期向CV520模塊發(fā)送數(shù)據(jù),CV520系統(tǒng)則在其中緩存數(shù)據(jù);數(shù)據(jù)采集通過WiFi網(wǎng)絡(luò),在與主機(jī)連接時(shí),仍能與主機(jī)保持連接。由上位機(jī)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和實(shí)時(shí)顯示。當(dāng)CV520用于SPISlave時(shí),SPIMaster只能等待SPIMaster啟動(dòng)通信連接,并基于主機(jī)提供的時(shí)鐘信號(hào)接收數(shù)據(jù)。ST是ST(意法半導(dǎo)體)開發(fā)的高性能微處理器,作為SPIMaster應(yīng)用時(shí),每個(gè)SPI控制器都能利用多個(gè)片選信號(hào)(CS0~CS2)連接多個(gè)被動(dòng)SPI設(shè)備。在CV520和ST設(shè)備中,CS為片選信號(hào),SCK為時(shí)鐘信號(hào),MOSI為數(shù)據(jù)輸出線,MISO為從設(shè)備數(shù)據(jù)輸出。
CV520主程序設(shè)計(jì)主要包括兩個(gè)模塊:無(wú)線模組公司遠(yuǎn)距離WiFi模組Wifi網(wǎng)絡(luò)配置模塊和線程與隊(duì)列模塊。而Wifi網(wǎng)絡(luò)配置模塊負(fù)責(zé)網(wǎng)絡(luò)的配置,線程和隊(duì)列模塊負(fù)責(zé)實(shí)現(xiàn)無(wú)線數(shù)據(jù)采集系統(tǒng)的主要功能,即:SPI數(shù)據(jù)采集和網(wǎng)絡(luò)數(shù)據(jù)發(fā)送。主要程序的設(shè)計(jì)過程具體包括以下幾步:1。程序的初始化:NVS存儲(chǔ)器的初始化和Wifi模式的配置。2.連接網(wǎng)絡(luò),Wifi網(wǎng)絡(luò)配置模塊連接到指定的AP,并獲取AP分配的IP。3.創(chuàng)建三個(gè)線程:SPI數(shù)據(jù)接收線程被用來(lái)調(diào)用SPI底層驅(qū)動(dòng),以接收STM32F407發(fā)送的數(shù)據(jù)和緩存;數(shù)據(jù)發(fā)送線程創(chuàng)建Socket與上位PC的
無(wú)線通訊連接模組,和SPI接收線程協(xié)作,向主機(jī)發(fā)送數(shù)據(jù);WEB服務(wù)器線程向主機(jī)提供信息查詢、使得計(jì)算機(jī)能夠通過瀏覽器在CV520上獲得運(yùn)行信息。
無(wú)線模組公司遠(yuǎn)距離WiFi模組CV520芯片支持高速、穩(wěn)定的WIFI通訊,支持三種模式:"AP"、"STA"、"AP+STA"。該方案采用STA模式,利用WIFI_init_sta()函數(shù)來(lái)配置STA模式。您需要配置WIFI帳號(hào)和口令來(lái)連接到指定的AP,然后才能進(jìn)入STA模式。STA模式配置STA模式的配置流程顯示了整個(gè)配置過程,使用函數(shù)WIFI_init_sta()完成STA模式配置,具體包括:創(chuàng)建用于在WIFI連接期間識(shí)別各種標(biāo)志位的事件組標(biāo)志。初始化硬件/軟件:使用"tcpip_adapter_init()"函數(shù)來(lái)初始化TCP/IP適配層,用'event_loop_init()初始化事件調(diào)度器'清空IP信息,讓事件回調(diào)函數(shù)從初始位置判斷標(biāo)志位。WIFI模塊的底層參數(shù)信息通過“WIFI_init_config_tcfg=WIFI_INIT_CONFIG_DEFAULT()”語(yǔ)句對(duì)WIFI模塊進(jìn)行初始化。配置STA模式參數(shù),將路由器的WIFI帳號(hào)、口令數(shù)據(jù)置于標(biāo)準(zhǔn)變量中。通過"WIFI_set_mode(WIFI_MODE_STA)"設(shè)置STA模式;WiFi_set_config(IF_WIFI_STA)WiFi_config)為STA模式設(shè)置配置信息;“WIFI_start()”語(yǔ)句啟動(dòng)WIFI狀態(tài)機(jī)。
線程化設(shè)計(jì)以隊(duì)列模塊程序?yàn)槔?,主要包括三線程和一個(gè)隊(duì)列的程序設(shè)計(jì)。三線程分別是SPI數(shù)據(jù)采集線程、數(shù)據(jù)發(fā)送線程和WEB服務(wù)線程,另外為了保證CV520系統(tǒng)能及時(shí)、高效地接收和發(fā)送數(shù)據(jù),需要使用隊(duì)列來(lái)保持SPI數(shù)據(jù)采集線程與數(shù)據(jù)發(fā)送線程之間的數(shù)據(jù)同步。
通過FreeRTOS的隊(duì)列“queue”,實(shí)現(xiàn)了SPI數(shù)據(jù)采集線程與數(shù)據(jù)發(fā)送線程之間的數(shù)據(jù)同步。其中一個(gè)基本原理是,不同的線程任務(wù)或者中斷程序都可以使用隊(duì)列來(lái)向數(shù)據(jù)寫入數(shù)據(jù)。事實(shí)上,該隊(duì)列是一個(gè)固定大小的空間,任何線程任務(wù)都能讀取和寫入。語(yǔ)句“queue=xQueueCreate(BLOCK_NUM,sizeof(char*))”,該語(yǔ)句用于創(chuàng)建隊(duì)列,F(xiàn)reeRTOS為線程的讀取和寫入指定了固定空間。而BLOCK_NUM將存儲(chǔ)的數(shù)據(jù)單元數(shù)目與緩沖存儲(chǔ)器空間數(shù)目一致。參數(shù)2設(shè)置一個(gè)數(shù)據(jù)單元的大小,在線程之間只需要傳遞存儲(chǔ)空間的首地址。SPI數(shù)據(jù)采集線程程序CV520通過SPI協(xié)議與STM32F407進(jìn)行數(shù)據(jù)傳輸,后者以一定時(shí)間間隔將數(shù)據(jù)字節(jié)發(fā)送給CV520。在充分考慮CV520有限的內(nèi)存和SPI底層驅(qū)動(dòng)機(jī)制的前提下,實(shí)現(xiàn)了SPI數(shù)據(jù)采集和線程間數(shù)據(jù)傳輸;在編程過程中,利用環(huán)形緩沖區(qū)將大小為M*NBytes、SPI信號(hào)線所接收的數(shù)據(jù)進(jìn)行存儲(chǔ)。在這里,M是一個(gè)單獨(dú)的存儲(chǔ)空間,N表示存儲(chǔ)空間的數(shù)目。本設(shè)計(jì)中CV520的SPI底層驅(qū)動(dòng)采用DMA機(jī)制,這樣建立的環(huán)狀緩沖區(qū)要求系統(tǒng)使用DMA存取的存儲(chǔ)器空間。MALLOC_CAP_DMA需要使用heap_caps_malloc函數(shù)對(duì)單個(gè)存儲(chǔ)器空間的選擇好基于每個(gè)SPI周期發(fā)送數(shù)據(jù)的長(zhǎng)度選擇,也就是M為每個(gè)周期SPI發(fā)送數(shù)據(jù)長(zhǎng)度的整數(shù)倍,同時(shí)為確保網(wǎng)絡(luò)傳輸效率,在MTU的尺寸盡可能接近于1300(CV520不支持切分,并且碎片會(huì)影響效率),每一次發(fā)送長(zhǎng)度是64Bytes,所以選擇M為64*20=1280Bytes,存儲(chǔ)空間的數(shù)目是N,從理論上選擇N越大,系統(tǒng)運(yùn)行中的緩存空間越大,SPI接收出錯(cuò)的概率就越低,但是因?yàn)镃V520的內(nèi)存空間有限,N會(huì)影響其它線程,實(shí)驗(yàn)中選擇N是5。SPI數(shù)據(jù)采集程序主要包括:SPI驅(qū)動(dòng)的初始化、初始環(huán)形緩沖的初始化、SPISlave讀取程序。SPISlave驅(qū)動(dòng)器通過操縱DMA和SPI控制器與SPIMaster進(jìn)行通訊,為應(yīng)用程序提供訪問接口,詳細(xì)的數(shù)據(jù)結(jié)構(gòu)和程序設(shè)計(jì)可供參考。SPISlave的讀取器流程是:1.循環(huán)調(diào)用spi_slave_transmit,通過spi_slave_interface_config_transmit將當(dāng)前緩沖區(qū)和接收數(shù)據(jù)信息指定給底層驅(qū)動(dòng),SPI接收開始,線程進(jìn)入掛起狀態(tài)等待接收結(jié)束。2.在接收結(jié)束之后,線程繼續(xù)運(yùn)行,通過xQueueSendToBack將接收到的數(shù)據(jù)所在存儲(chǔ)空間的一地址加入隊(duì)列。將當(dāng)前緩沖區(qū)切換為下一個(gè)環(huán)形緩沖區(qū)重復(fù)。
在STA模式下,數(shù)據(jù)發(fā)送線程設(shè)計(jì)了Socket接口和上位機(jī)建立通訊連接的兩種方法,即“TCP模式”和“UDP模式”。TCP模式下傳輸?shù)臄?shù)據(jù)不易丟失,而UDP模式傳輸?shù)臄?shù)據(jù)易發(fā)生誤判,所以這種連接采用TCP方式。在無(wú)線模組公司遠(yuǎn)距離WiFi模組CV520連接上WIFI并獲得了AP所分配的IP之后,就可以通過Socket接口與上位機(jī)進(jìn)行通信,發(fā)送所獲數(shù)據(jù)。Socket是CV520與主機(jī)之間進(jìn)行通信的接口。CV520主動(dòng)向上位機(jī)發(fā)出連接請(qǐng)求,上位機(jī)在接通之前打開監(jiān)聽器的Socket接口,實(shí)時(shí)監(jiān)視客戶的請(qǐng)求,一旦連接建立,CV520與上位機(jī)就可以進(jìn)行通訊。CV520與上位機(jī)通訊連接建立流程:1.定義下列Sock_fd:"sock_fd"監(jiān)聽套接口描述符;""client_fd""數(shù)據(jù)傳輸套接口描述符";"bind_fd"綁定IP/端口套接口描述符。用端口號(hào)保存本地IP的本地地址變量"my_addr";定義目標(biāo)地址變量"client_addr""來(lái)保存目標(biāo)機(jī)IP和端口號(hào)。2.使用socket(AF_INET,SOCK_STREAM,0)創(chuàng)建Socket監(jiān)聽。3.用Socket綁定本地IP、端口號(hào)、協(xié)議類型下面是以下主要程序:my_addr.sin_family=AF_INET;my_addr.sin_port=htons(PORT);my_addr.sin_addr.s_addr=htonl;bind_fd=bind(sock_fd,(structsockaddr*)&my_addrsizeof(my_addr));4.打開監(jiān)聽Socket,使系統(tǒng)處于監(jiān)聽狀態(tài),等待主機(jī)連接請(qǐng)求用“l(fā)isten(sock_fd,10)”的語(yǔ)句監(jiān)聽。通過accept(sock_fd,(structsockaddr*)&client_addr,&sin_size)語(yǔ)句來(lái)創(chuàng)建通信socket。6.在確定連接被建立之后,在隊(duì)列為空的情況下,調(diào)用xQueueReceive讀取隊(duì)列,直到該線程處于非空狀態(tài)。從隊(duì)列中獲得數(shù)據(jù)存儲(chǔ)空間的首地址,如果隊(duì)列是非空的。使用write(newconn,(char*)tmp,BUF_SIZE)將數(shù)據(jù)發(fā)送給主機(jī)。如發(fā)送失敗則返回-1,程序進(jìn)入錯(cuò)誤停止發(fā)送程序;如果發(fā)送數(shù)據(jù)成功將返回實(shí)際發(fā)送的字符數(shù)。
Web服務(wù)器線程程序設(shè)計(jì)Web是一種網(wǎng)絡(luò)通信協(xié)議,是在單一TCP連接上實(shí)現(xiàn)全雙工通信的協(xié)議。當(dāng)無(wú)線模組公司遠(yuǎn)距離WiFi模組CV520連接到WIFI之后,將創(chuàng)建一個(gè)WEB服務(wù)器線程,用來(lái)向主機(jī)提供信息查詢。主機(jī)發(fā)送HTTP請(qǐng)求后,系統(tǒng)會(huì)把從SPI接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù)信息返回給主機(jī)瀏覽器,方便用戶查詢?cè)跀?shù)據(jù)通信過程中是否有報(bào)文丟失。WEBServices線程程序設(shè)計(jì)的主要步驟是:1.創(chuàng)建Socket連接,綁定用于監(jiān)聽PC機(jī)連接的本地IP地址和80端口。在主機(jī)發(fā)出連接請(qǐng)求后,系統(tǒng)與主機(jī)進(jìn)行連接,建立通信socket。2.CV520讀取由主機(jī)發(fā)送的請(qǐng)求數(shù)據(jù),并將其置于recv_buffer的字符類型數(shù)組中,使用strncmp(char*)recv_buffer語(yǔ)句,"GET",3)==0判斷請(qǐng)求報(bào)文的前三個(gè)字符是否是"GET",若有,則執(zhí)行以下命令:sprintf(disp、spi:%d;tcp:%d!\r
"spi_count,tcp_count);strcpy(htmldata,htmldata_h);strcat(htmldata,disp);strcat(htmldata,htmldata_t);寫入(conn,htmldatastrlen(htmldata));disp是定制字符類型的數(shù)組,用來(lái)存儲(chǔ)返回的數(shù)據(jù);spi_count將統(tǒng)計(jì)系統(tǒng)收到的SPI數(shù)據(jù),tcp_count為系統(tǒng)發(fā)送給主機(jī)的數(shù)據(jù);htmldata是一個(gè)長(zhǎng)度為200的字符類型數(shù)組;htmldata_h和htmldata_t定義如下:charhtmldata_h[]="《html>"head><其他需要返回的信息也可由用戶自己定義。
本實(shí)驗(yàn)主要通過兩塊開發(fā)板進(jìn)行系統(tǒng)搭建,一塊是CV520-DevKitC,一塊是Ai-ThinkerIDEV1.0,另一塊是SPI連接到兩個(gè)開發(fā)板。因?yàn)橹恍枰獑蜗虬l(fā)送,除去VCC和地線,只需要連接三條線。利用杜邦線按照電路接線連接好實(shí)物,硬件設(shè)備連接完畢后顯示。其中每一色的杜邦線對(duì)應(yīng)一條接線,黑色為地線,綠色為串行鐘信號(hào)線,橙色為MOSI數(shù)據(jù)線,黃色為片選信號(hào)線。這個(gè)試驗(yàn)主要是驗(yàn)證無(wú)線模組公司遠(yuǎn)距離WiFi模組CV520和Wifi之間的連接是否正常,以及是否可以正常接收SPI數(shù)據(jù),通過WiFi將數(shù)據(jù)發(fā)送給上位機(jī),同時(shí)計(jì)算數(shù)據(jù)傳輸過程中的速率和丟包率。先測(cè)試CV520和WiFi的連接,CV520輸出可通過串口調(diào)試工具進(jìn)行打印,清楚地顯示CV520當(dāng)前正在運(yùn)行的連接狀態(tài);在系統(tǒng)連接上電之后,即進(jìn)入準(zhǔn)備狀態(tài),按下CV520RST鍵,CV520自動(dòng)連接到WiFi。從串口調(diào)試工具可以看到整個(gè)WiFi連接過程,可以看出,CV520系統(tǒng)首先是STA模式配置,在完成STA模式配置之后,輸出當(dāng)前的用戶名和密碼,然后AP為它分配IP地址。如果打印獲得IP地址,就表明CV520連接AP成功,AP為192.168.2.30分配IP地址。使用串口打印的提示信息可以看到CV520系統(tǒng)的準(zhǔn)備過程,其中,spi_taskon表示SPI數(shù)據(jù)接收線程打開;Data_trans_taskon表示數(shù)據(jù)發(fā)送線程打開;Da-ta_trans_tasklisten和Initial_SPIDone表示CV520系統(tǒng)已打開SPI的監(jiān)聽端口,并完成SPI初始化配置;Http_taskon指示W(wǎng)EB服務(wù)線程打開;Data_trans_taskaccept表示CV520系統(tǒng)與上位機(jī)已建立TCP連接且能夠開始傳輸數(shù)據(jù)。如果你能看到由上位機(jī)接收的數(shù)據(jù)總字節(jié)的數(shù)目是38400Bytes,而且數(shù)據(jù)在從0開始到2之后又重新設(shè)置為0。主機(jī)會(huì)以.dat格式以.dat格式保存接收的數(shù)據(jù),打開該文件可查看具體接收數(shù)據(jù),每個(gè)數(shù)據(jù)間隔0.001,無(wú)需考慮浮點(diǎn)數(shù)存儲(chǔ)錯(cuò)誤。為了檢驗(yàn)發(fā)送過程的成功率,接收和發(fā)送的數(shù)據(jù)量可通過瀏覽器訪問CV520系統(tǒng)獲得:其中spi:384000Bytes表明CV520系統(tǒng)從STM32F407接收到的SPI數(shù)據(jù)是384000Bytes。tcp:384000Bytes是指由TCP連接發(fā)送到CV520系統(tǒng)的數(shù)據(jù),CV520系統(tǒng)接收到的數(shù)據(jù)量與發(fā)出的數(shù)據(jù)量一致,而且通過上位機(jī)軟件可以看到上位機(jī)接收的總數(shù)據(jù)也是384000Bytes,CV520系統(tǒng)通過Wifi向主機(jī)發(fā)送的數(shù)據(jù)與上位機(jī)接收的數(shù)據(jù)一致,結(jié)果表明,在無(wú)線傳輸過程中數(shù)據(jù)沒有丟失,丟失率為0%。另從可見的6.01S數(shù)據(jù)的接收時(shí)間為6.01S,經(jīng)計(jì)算得出數(shù)據(jù)的傳輸速率為62.5KB/s(500Kbps)。試驗(yàn)結(jié)果表明,該設(shè)計(jì)方案是可行的。
例如,以ST連接CV520,CV520通過WIFE連接主機(jī),對(duì)無(wú)線模組公司遠(yuǎn)距離WiFi模組CV520無(wú)線網(wǎng)絡(luò)配置中的數(shù)據(jù)收發(fā)程序進(jìn)行了詳細(xì)的設(shè)計(jì)和說明,與此同時(shí),為CV520系統(tǒng)設(shè)計(jì)了WEB服務(wù)程序,方便上位機(jī)查詢信息。進(jìn)行了硬件平臺(tái)測(cè)試,驗(yàn)證了應(yīng)用程序的正確性和驅(qū)動(dòng)性能。試驗(yàn)結(jié)果表明,該無(wú)線數(shù)據(jù)采集與傳輸系統(tǒng)程序設(shè)計(jì)合理,使用方便,但其性能有待進(jìn)一步優(yōu)化和提高。今后還會(huì)進(jìn)一步優(yōu)化軟硬件設(shè)計(jì),提高抗干擾能力和數(shù)據(jù)傳輸效率,改善系統(tǒng)性能。