文/李晨 蔣林 劉思平
在工業(yè)通信控制領(lǐng)域,隨著科學(xué)技術(shù)的發(fā)展,對數(shù)據(jù)傳輸?shù)臅r(shí)實(shí)性、時(shí)間響應(yīng)的要求越來越高。相比較于傳統(tǒng)的RS-485或RS-232通信方式,工業(yè)以太網(wǎng)RJ45具有通信速率高、傳輸距離長、方便布線等優(yōu)點(diǎn),本系統(tǒng)用了STM32F107微控制芯片移植LWIP輕協(xié)議棧,通過STM32F107的網(wǎng)絡(luò)中斷接收到觸發(fā)方式,降低了單片機(jī)資源與通信延遲,提高了處理效率,提高了通信穩(wěn)定可靠性。
本系統(tǒng)軟件部分采用了UCOS操作系統(tǒng)下移植了LWIP協(xié)議棧,利用STM32F107自帶的DMA+ETH中斷實(shí)現(xiàn)快速高效傳輸,同時(shí)采用UDP服務(wù)器模式進(jìn)行通信,從而實(shí)現(xiàn)工業(yè)上的高效通信,系統(tǒng)的Lwip通信程序流程圖如1所示。
在軟件流程圖中可以清晰的看到,先初始化系統(tǒng),進(jìn)行UCOS初始化并創(chuàng)建Lwip任務(wù),在任務(wù)中先進(jìn)行DP8348硬件初始化,在進(jìn)行Lwip初始化,然后建立UDP服務(wù)器,Lwip任務(wù)就可以掛起任務(wù)了;同時(shí)在網(wǎng)絡(luò)中斷中進(jìn)行數(shù)據(jù)包接收讀取,讀取到數(shù)據(jù)包后進(jìn)行命令解析、數(shù)據(jù)處理,最后在回發(fā)給客戶端,完成一輪的數(shù)據(jù)通信。由于使用了DMA進(jìn)行對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行控制,并且數(shù)據(jù)都是在中斷接收回調(diào)函數(shù)中處理回發(fā),如果沒有接收到數(shù)據(jù),是不會(huì)占用CPU資源,進(jìn)一步降低了CPU的負(fù)擔(dān),減少了通信延遲,提高了處理效率,提高了通信穩(wěn)定可靠性。
圖1:Lwip程序數(shù)據(jù)流程圖
LWIP是一個(gè)輕量級(jí)的開源免費(fèi)的TCP/IP協(xié)議棧,移植Lwip協(xié)議??梢詮腖wip官網(wǎng)下載源碼,也可在STM32官網(wǎng)上下載帶Lwip協(xié)議棧的源碼。本系統(tǒng)在UCOS操作系統(tǒng)下移植了LWIP協(xié)議棧,但是實(shí)際上使用軟件為ETH中斷+DMA接收觸發(fā),已經(jīng)和是否使用嵌入式系統(tǒng)沒太大關(guān)系了,本系統(tǒng)使用UCOS系統(tǒng)為了優(yōu)化程序本身,進(jìn)一步提高單片機(jī)效率。在移植LWIP協(xié)議棧中,將宏NO_SYS設(shè)置為1,同時(shí)本系統(tǒng)使用了RAW的UDP接口方式,在頭文件中對應(yīng)需要把LWIP_NETCONN與LWIP_SOCKET設(shè)置為0,LWIP_UDP設(shè)置為1,從而啟動(dòng)UDP協(xié)議。工業(yè)設(shè)備終端作為UDP服務(wù)器,一般需要固定IP地址,因此在將LWIP_DHCP設(shè)置為0,關(guān)閉自動(dòng)獲取IP地址,最后配置MEM_SIZE、PBUF_POOL_SIZE、PBUF_POOL_BUFSIZE等設(shè)置POOL與HEAP的內(nèi)存大小。
在Lwip的初始化過程中在對設(shè)備MAC地址進(jìn)行設(shè)置時(shí),為了防止出現(xiàn)設(shè)備MAC地址沖突而無法正常工作,可讀取STM32內(nèi)部的唯一ID為MAC地址。Lwip的初始化代碼如下:
Lwip初始化完成后,系統(tǒng)采用了DMA+ETH中斷方式進(jìn)行數(shù)據(jù)接收,還需編寫對應(yīng)ETH中斷函數(shù),網(wǎng)絡(luò)中斷對應(yīng)代碼如下:
先用STM固件庫中的ETH_GetRxPktSize()檢測是否收到數(shù)據(jù)包,再調(diào)用Lwip協(xié)議棧的LwIP_Pkt_Handle()接收處理函數(shù),從以太網(wǎng)緩沖區(qū)讀取接收到的數(shù)據(jù)包,最后清除DMA對應(yīng)的中斷標(biāo)志位。
如今網(wǎng)絡(luò)數(shù)據(jù)通信,一般采用TCP協(xié)議或UDP協(xié)議,相比較于TCP協(xié)議,UDP協(xié)議是一種無連接,不可靠,傳輸速度快,相對安全性高、可實(shí)現(xiàn)一對一,多對一的傳輸層的協(xié)議。在工業(yè)應(yīng)用場合中,UDP協(xié)議更高的效率,更快的傳輸實(shí)時(shí)性,資源占用率更低,反而更加適合。隨著網(wǎng)絡(luò)控制芯片與技術(shù)的發(fā)展,使得UDP協(xié)議的丟包率已經(jīng)很低了,應(yīng)用層的協(xié)議優(yōu)化,也大大增加了數(shù)據(jù)傳輸?shù)目煽啃?。UDP服務(wù)端的代碼初始化如下:
UDP服務(wù)端初始化后,Lwip的子任務(wù)就可直接掛起,等待網(wǎng)絡(luò)中斷接收到數(shù)據(jù)包后,進(jìn)入回調(diào)函數(shù)。在回調(diào)函數(shù)中,在此進(jìn)行數(shù)據(jù)處理解析后,把數(shù)據(jù)發(fā)送回客戶端,發(fā)送完后在釋放遠(yuǎn)程客戶端的連接與內(nèi)存即可。
將系統(tǒng)硬件設(shè)備用網(wǎng)線接入路由器中,與計(jì)現(xiàn)代信息科技 ,2018,2(G軟件對系統(tǒng)設(shè)備進(jìn)行測試,結(jié)果主機(jī)每100ms對設(shè)備ping 32字節(jié)數(shù)據(jù),一共不間斷連續(xù)發(fā)送56萬包數(shù)據(jù),最短時(shí)間0ms,最大時(shí)間3ms,平均時(shí)間0.11ms,丟包率為0%。同時(shí)為了測試通信的穩(wěn)定性,每間隔100ms發(fā)送數(shù)據(jù),總共發(fā)送515946個(gè)包,15個(gè)小時(shí),接收515946個(gè)包,丟包率為0%,在實(shí)際應(yīng)用中,如果出現(xiàn)錯(cuò)誤、丟包的情況,通過應(yīng)用層協(xié)議,重復(fù)向設(shè)備終端發(fā)送命令進(jìn)行查詢通信,以此進(jìn)一步提高數(shù)據(jù)通信的可靠性與穩(wěn)定性。
UDP協(xié)議是一個(gè)非連接的協(xié)議,通信數(shù)據(jù)的客戶端和服務(wù)端不建立連接,當(dāng)它發(fā)送數(shù)據(jù)時(shí),只是可能快地把它丟到到網(wǎng)絡(luò)上,一對多傳送也可兼容,并且在做斷網(wǎng)重連測試的時(shí)候,也不需要像TCP協(xié)議一樣,還得專門定時(shí)查詢處理,只要設(shè)備重新連接上網(wǎng)絡(luò)后,就可恢復(fù)正常通信。
本文提供了一種基于基于STM32與Lwip協(xié)議棧的高效通信技術(shù),利用STM32F107的ETH中斷+DMA方式,通過移植Lwip協(xié)議棧,使用UDP服務(wù)端模式通信,從而實(shí)現(xiàn)工業(yè)上的高效通信技術(shù)。經(jīng)過測試,在多對一下以100ms間隔的通信,經(jīng)過長達(dá)15多個(gè)小時(shí)的測試,以極低的丟包率與錯(cuò)誤率證明,該技術(shù)方案有效的優(yōu)化單片機(jī)資源與通信延遲,并提高了通信穩(wěn)定可靠性,在嵌入式工業(yè)應(yīng)用上具備了相當(dāng)?shù)膶?shí)用價(jià)值。