1硬件系統的設計
本串口服務器采用Philips的ARM7系列芯片LPC2210,網絡控制芯片采用RTL8019,串口采用TL16C554芯片擴展。為得到更廣泛的應用,串口端還擴展485接口,通過跳線選擇232/485方式。系統結構框圖,如圖1所示。

圖1系統結構框圖
2軟件系統的實現
串口服務器軟件系統包括兩部分:TCP/IP協議棧的移植和實時多任務應用程序。μC/OS-Ⅱ在LPC系列ARM中的移植采用周立功公司的方案。
2.1TCP/IP協議棧的移植
LWIP是瑞士人AdmaDumkels等開發的源代碼開放的精簡TCP/IP協議棧。目的是在于保證TCP協議完整的情況下減少系統資源的需求,適合于資源較少的嵌入式系統應用。移植LWIP協議棧主要有兩部分代碼:(1)編寫操作系統模擬層相關代碼;(2)LWIP接口初始設置及網卡驅動。
2.1.1操作系統模擬層相關代碼
操作系統模擬層存在的目的主要是在μC/OS-Ⅱ和LWIP之間提供一座橋梁,使LWIP能與μC/OS-Ⅱ能以相同的規范存在于一個系統中并能相互通信。LWIP有信號量和郵箱兩種進程通訊方式,而μC/OS-Ⅱ也提供這兩種進程通訊方式。
信號量用來同步任務,操作函數有sys_new_sem(建立并返回一個新信號量),sys_sem_signal(指定要發送的信號量),sys_sem_free(指定要釋放的信號量),sys_arch_sem_wait(等待由參數sem指定的信號量并阻塞線程),在這些函數體中進行數據結構的初始化并加入μC/OS-Ⅱ中的相關函數便可完成。
郵箱用來投遞消息,LWIP允許將郵箱實現為一個隊列,多條消息投遞到這個郵箱。
μC/OS-Ⅱ提供了豐富的消息隊列函數,且μC/OS-Ⅱ和LWIP投遞到郵箱中的消息均用指針實現。該系統建立了多個郵箱,郵箱通過單向鏈表接在一起。接收消息的最大數量由消息數組決定,結構圖如圖2所示。

圖2郵箱數據結構圖
郵箱建好后用指針P_Mbox指向節點1,申請新郵箱將節點1和節點2斷開,P_Mbox指向節點1的pstNext,以此類推。回收時P_Mbox的移動方向與申請時相反,這樣不會浪費內存且比較穩定。由以上結構和μC/OS-Ⅱ提供的函數寫出郵箱相關函數。
除此之外,還需要編寫任務創建函數sys_thread_new和sys_arch_timeouts函數,由于每個任務都有timeouts鏈表,sys_arch_timeouts函數返回的sys_timeouts結構保存了timeouts鏈表的首地址。
2.1.2LWIP初始化設置及底層驅動
LWIP的初始化設置包含在LWIP通信進程的入口函數中,其入口函數LwipEntry的基本結構如下:
Void Lwip Entry(void 3 pvArg)
{
//初始化LW IP,涉及LWIP使用的內存區,PCB(TCP/UDP)以及OS模擬層各個方面
__ilvInitLwip();
//設置LW IP,包括添加配置網絡接口,建立接受任務等工作
__ilvSetLwip();
//在這里建立LWIP的應用,服務器支持TCP/UDP方式,兩種方式都建立
}
底層驅動在服務器每次收發數據中都要調用,這部分代碼需要有良好的健壯性和穩定性。整個實現順序,如圖3所示。

圖3底層程序框架圖
發送主線首先是以太網初始化函數(1)開始,調用鏈路層發送函數(2)并增加各層協議頭,再調用RTL8019發送函數(9)發送數據。
接收主線除初始化以太網外,需調用鏈路層初始化函數(3),(3)中調用(4)初始化RTL8019。
收到的數據先經過函數(8),然后通過信號量傳送到函數(6),由(6)調用(7)得到數據個數,最后由(5)根據以太網幀頭攜帶的上層協議類型判斷是交給IP協議還是ARP協議處理。
移植完畢,進行數據收發實驗驗證。使用TCP傳輸協議,由網口虛擬串口軟件VSPM通過串口調試工具收發數據,圖4是以10ms的發送速度在自發自收程序中收發數據的截圖。

圖4TCP協議數據傳輸界面
由于COM1和COM2被PC機占用,故由網口虛擬出來的串口是COM3,由圖4可看出在面向連接的TCP協議下,高速收發數據不會丟包。
2.2實時多任務方案的設計
16個串口分別與網絡端口組成16個雙向通道。為使代碼靈活、透明,程序不使用LWIP提供的SOCKETAPI。應用程序把每個雙向通道分為發送,接收,串口3個任務,加上LWIP本身需占用一個任務,共需建立49個任務。μC/OS-Ⅱ最多能建立64個任務,其中8個操作系統本身占用,剩56個能滿足要求。由VSPM軟件把網口模擬成16個串口,串口服務器偵聽的16個端口分別是1000~1015,如圖5所示。

圖5網口虛擬擴展16個串口界面
網絡端和串口端的數據接收會觸發相應的中斷。每個雙向通道的3個任務各司其職,網口端接收數據中斷后在傳輸層協議判斷信源的端口號,交給相應的接收任務,處理完后交給串口任務把數據從相應串口發送;串口接收數據后在中斷程序中判斷信源的通道號,把數據交給串口任務,處理完后由發送任務通過網口把數據發送出去。
服務器支持TCP/UDP兩種傳輸協議,下面給出一個通道的TCP傳輸流程圖,UDP部分代碼只需在相應任務中調用LWIP給的UDP函數。TCP模式下串口服務器工作在Server模式,PC機工作在Client模式,流程圖,如圖6所示。

圖6串口服務器單通道程序流程圖
3.結論
文中本服務器是以性能不及ARM9且不能使用Linux的ARM7為主控芯片,但兩種開源代碼μC/OS-Ⅱ實時操作系統和LWIP協議棧的有效結合避免了高額的軟件費用,而且能滿足通信要求。實驗證明,基于LWIP和μC/OS-Ⅱ的串口服務器不僅能實現雙向通信,而且傳輸數據實時、準確,符合工業應用的要求。
