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