文/李晨 蔣林 劉思平
在工業(yè)通信控制領(lǐng)域,隨著科學(xué)技術(shù)的發(fā)展,對(duì)數(shù)據(jù)傳輸?shù)臅r(shí)實(shí)性、時(shí)間響應(yīng)的要求越來(lái)越高。相比較于傳統(tǒng)的RS-485或RS-232通信方式,工業(yè)以太網(wǎng)RJ45具有通信速率高、傳輸距離長(zhǎng)、方便布線等優(yōu)點(diǎn),本系統(tǒng)用了STM32F107微控制芯片移植LWIP輕協(xié)議棧,通過(guò)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)行對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行控制,并且數(shù)據(jù)都是在中斷接收回調(diào)函數(shù)中處理回發(fā),如果沒(méi)有接收到數(shù)據(jù),是不會(huì)占用CPU資源,進(jìn)一步降低了CPU的負(fù)擔(dān),減少了通信延遲,提高了處理效率,提高了通信穩(wěn)定可靠性。

圖1:Lwip程序數(shù)據(jù)流程圖
LWIP是一個(gè)輕量級(jí)的開(kāi)源免費(fèi)的TCP/IP協(xié)議棧,移植Lwip協(xié)議棧可以從Lwip官網(wǎng)下載源碼,也可在STM32官網(wǎng)上下載帶Lwip協(xié)議棧的源碼。本系統(tǒng)在UCOS操作系統(tǒng)下移植了LWIP協(xié)議棧,但是實(shí)際上使用軟件為ETH中斷+DMA接收觸發(fā),已經(jīng)和是否使用嵌入式系統(tǒng)沒(méi)太大關(guān)系了,本系統(tǒng)使用UCOS系統(tǒng)為了優(yōu)化程序本身,進(jìn)一步提高單片機(jī)效率。在移植LWIP協(xié)議棧中,將宏NO_SYS設(shè)置為1,同時(shí)本系統(tǒng)使用了RAW的UDP接口方式,在頭文件中對(duì)應(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的初始化過(guò)程中在對(duì)設(shè)備MAC地址進(jìn)行設(shè)置時(shí),為了防止出現(xiàn)設(shè)備MAC地址沖突而無(wú)法正常工作,可讀取STM32內(nèi)部的唯一ID為MAC地址。Lwip的初始化代碼如下:


Lwip初始化完成后,系統(tǒng)采用了DMA+ETH中斷方式進(jìn)行數(shù)據(jù)接收,還需編寫(xiě)對(duì)應(yīng)ETH中斷函數(shù),網(wǎng)絡(luò)中斷對(duì)應(yīng)代碼如下:

先用STM固件庫(kù)中的ETH_GetRxPktSize()檢測(cè)是否收到數(shù)據(jù)包,再調(diào)用Lwip協(xié)議棧的LwIP_Pkt_Handle()接收處理函數(shù),從以太網(wǎng)緩沖區(qū)讀取接收到的數(shù)據(jù)包,最后清除DMA對(duì)應(yīng)的中斷標(biāo)志位。
如今網(wǎng)絡(luò)數(shù)據(jù)通信,一般采用TCP協(xié)議或UDP協(xié)議,相比較于TCP協(xié)議,UDP協(xié)議是一種無(wú)連接,不可靠,傳輸速度快,相對(duì)安全性高、可實(shí)現(xiàn)一對(duì)一,多對(duì)一的傳輸層的協(xié)議。在工業(yè)應(yīng)用場(chǎng)合中,UDP協(xié)議更高的效率,更快的傳輸實(shí)時(shí)性,資源占用率更低,反而更加適合。隨著網(wǎng)絡(luò)控制芯片與技術(shù)的發(fā)展,使得UDP協(xié)議的丟包率已經(jīng)很低了,應(yīng)用層的協(xié)議優(yōu)化,也大大增加了數(shù)據(jù)傳輸?shù)目煽啃浴DP服務(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軟件對(duì)系統(tǒng)設(shè)備進(jìn)行測(cè)試,結(jié)果主機(jī)每100ms對(duì)設(shè)備ping 32字節(jié)數(shù)據(jù),一共不間斷連續(xù)發(fā)送56萬(wàn)包數(shù)據(jù),最短時(shí)間0ms,最大時(shí)間3ms,平均時(shí)間0.11ms,丟包率為0%。同時(shí)為了測(cè)試通信的穩(wěn)定性,每間隔100ms發(fā)送數(shù)據(jù),總共發(fā)送515946個(gè)包,15個(gè)小時(shí),接收515946個(gè)包,丟包率為0%,在實(shí)際應(yīng)用中,如果出現(xiàn)錯(cuò)誤、丟包的情況,通過(guò)應(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ò)上,一對(duì)多傳送也可兼容,并且在做斷網(wǎng)重連測(cè)試的時(shí)候,也不需要像TCP協(xié)議一樣,還得專門(mén)定時(shí)查詢處理,只要設(shè)備重新連接上網(wǎng)絡(luò)后,就可恢復(fù)正常通信。
本文提供了一種基于基于STM32與Lwip協(xié)議棧的高效通信技術(shù),利用STM32F107的ETH中斷+DMA方式,通過(guò)移植Lwip協(xié)議棧,使用UDP服務(wù)端模式通信,從而實(shí)現(xiàn)工業(yè)上的高效通信技術(shù)。經(jīng)過(guò)測(cè)試,在多對(duì)一下以100ms間隔的通信,經(jīng)過(guò)長(zhǎng)達(dá)15多個(gè)小時(shí)的測(cè)試,以極低的丟包率與錯(cuò)誤率證明,該技術(shù)方案有效的優(yōu)化單片機(jī)資源與通信延遲,并提高了通信穩(wěn)定可靠性,在嵌入式工業(yè)應(yīng)用上具備了相當(dāng)?shù)膶?shí)用價(jià)值。