目前,嵌入式技術已經廣泛滲入並應用到各領域,涉及到多種傳統及現代技術,形成了前所未有的多學科、多領域的交叉與融合。由Z-World公司推出的RCM2200[1]是一款低成本的嵌入式微控製器核心模塊,它采用Dynamic C®[2]這一專門為Z-World產品創建的集成的C 編譯器、編輯器、鏈接器、裝載器和調試器,便於實現快速開發應用,加快產品投放到市場。
UDP協議[3][4]是比較著名的傳輸層協議之一,它與TCP協議一樣是基於IP協議的,但與TCP不bu同tong的de是shi它ta不bu需xu要yao協xie議yi層ceng提ti供gong質zhi量liang保bao證zheng,因yin此ci,在zai需xu要yao實shi時shi數shu據ju傳chuan輸shu的de情qing況kuang下xia應ying用yong比bi較jiao廣guang泛fan。並bing且qie,因yin為wei不bu提ti供gong質zhi量liang保bao證zheng,服fu務wu器qi沒mei有you必bi要yao一yi直zhi處chu於yu等deng待dai狀zhuang態tai,從cong而er大da大da減jian輕qing了le服fu務wu器qi的de負fu擔dan。在zai某mou些xie情qing況kuang下xia,還hai可ke以yi根gen據ju需xu要yao給geiUDP報文加上一些質量保證控製,有很大的靈活度。
在不遠的將來,將設備與網絡相連將成為一種趨勢。在諸如GPS串口數據網絡收發以及某些語音傳輸、實時監控等多種場合,實現以太網與異步串口數據之間的通信是非常必要的。本文介紹了一種基於RCM2200嵌入式微控製器核心模塊利用UDP報文實現網絡與串口互通的方法,可以迅速實現將串口與網絡相連接。
2 係統原理及功能
RCM2200采用Rabbit半導體公司推出的高性能8位器件-Rabbit2000型微處理器;帶RJ-45插口的內置10Base-T端口簡化了網絡連接,便於開發帶以太網接口的監控、通訊設備;配備有4個串行口,方便擴展聯接;擁有26根並行的I/O引線以及16根可設置的I/O引線,無須擴展即可完成一般的I/O任務;擁有256K Flash,128K SRAM, 用於代碼存儲和數據存儲;時間、日期、看門狗、定時器等一應俱全;且其采用雙列直插式引腳,尺寸僅為59 x 41 x 22 mm。這種結構促進了嵌入式係統的快速開發,並可實現集成的以太網連接。
RCM2200係統的基本框架結構如圖1所示。

圖1 RCM2200係統結構
RCM2200采用Dynamic C®語言進行軟件開發,與標準C語言相比,Dynamic C的改進和差異在於使得在功能強大的嵌入式係統上進行實時編程變得非常容易。 語言的擴展包括多任務和優先多任務的構造,當供電失敗時,能夠保護寫入變量, 能夠寫入到中斷程序中去。標準C函數庫,特定板的外圍驅動,芯片外圍設備,以及其他的性能以源代碼的形式包含在Dynamic C中。完全支持彙編語言,在對時間要求較高的應用中,彙編代碼可以方便的與C代碼混用。
在該開發係統中將RCM2200的以太網接口與當地局域網相連,選擇一個串口與計算機的串口相連。由以太網發送UDP報文給RCM2200微控製器核心模塊經過處理後通過串口發送給計算機,由計算機串口發送數據給RCM2200微控製器核心模塊經過處理後通過其上的網絡口發送UDP報文給以太網,從而實現基於RCM2200以太網和串口之間的通信。
3 UDP協議的實現
UDP協議是比較著名的傳輸層協議之一,它使用IP作為網絡層協議,為應用程序發送和接收數據報。但是,它提供無連接服務,是不可靠傳輸。因此,UDP報文主要用於需要實時數據傳輸的情況,一次傳輸少量的數據。在某些對實時性要求很高的場合,利用UDP報文進行數據傳輸是非常必要的,但往往要采用一些可靠性方案,以防止有漏傳、誤傳的現象發生。
3.1 客戶機/服務器程序設計模式
客戶機/服務器的程序設計模式在網絡程序設計中被大量的應用。這種設計模式將整個係統分為兩大部分――服務器部分和客戶機部分。客戶機向服務器提出請求,服務器對請求作相應的處理將結果返回給客戶機。
根據不同的實際情況,客戶機/服務器的通信存在對稱和非對稱兩種方式。在對稱的方式下,通信的每一方都可能扮演主從角色;zaifeiduichengdefangshixia,yifangbukegaibianderenweishizhuji,erlingyifangzeshicongji。wulunshiduichengdehuoshifeiduichengde,dangfuwubeitigongshibirancunzaikehujinchenghefuwujincheng。jiyuUDP協議的通信既可采用對稱方式也可采用非對稱方式。
3.2 數據報套接字
套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。
UDP協議支持數據報套接字。這種套接字可以采用客戶/服務器模式,以全雙工方式工作,接收發送可以同時進行,但並不保證數據傳輸的可靠性、有序性和無重複性,需要由程序員負責管理數據報的排序和可靠性。
3.3 使用Dynamic C實現UDP報文的傳輸
Dynamic C提供了許多支持TCP/IP協議的庫函數。其中,DCRTCP.LIB是最主要的函數庫。
下麵將簡要介紹UDP協議下的基本通信流程。
3.3.1 調用本地初始化函數
void sock_init(void)
該函數將使用默認配置初始化本地信息包驅動器以及DCRTCP.LIB函數庫。該函數必須在其他網絡庫函數被使用前進行調用。
3.3.2 打開數據報套接字
int udp_open( *s, lport, remote_IP, port, *data_handler ())
其中的參數解釋如下:
s : 指向UDP套接字的指針;
lport : 本地協議端口;
remote_IP : 可接受的遠地主機IP地址,如果該項為-1,則支持廣播通信;
port : 可接受的遠地進程協議端口,如果該項為-1,則為廣播數據報;
data_handler() : 如果接收到數據則調用該函數;
該函數的返回值,如果成功返回非零,否則返回零值。
3.3.3 接收遠地主機發送的數據報
int udp_recv( *s, *buf_recv, recv_len)
當套接字初始化後用該函數掃描接收緩衝區,,察看是否有數據報到達。其中,buf_recv : 指向用於存放已到達數據報的數組的指針;recv_len : 存放數據報的數組的大小。如果接收到數據報則返回數據報的長度;否則返回-1。
3.3.4 發送數據報給遠地主機
int udp_send( *s, *buf_send, send_len )
調用該函數發送數據報給遠地主機。如果成功返回該數據報的長度,否則返回-1。
buf_send : 指向待發送數據報的指針;
send_len : 待發送數據報的長度。
3.3.5 網絡信息處理函數
int tcp_tick( *s )
gaihanshujiangchakanwangluolianjiezhuangtai,jianzhashujubaodedaodaqingkuang,chulixindaoshujubaobingzhongchuandiushideshujubao。ruochuxianwangluolianjiebeifuweijitaojieziyiguanbideqingkuanghuocanliangs為NULL,則返回值為零;否則返回非零值。
3.3.6 關閉套接字
void sock_close( *s )
當數據傳送工作完成或傳送過程中發生錯誤時,可調用該函數關閉套接字
4 串口通信的實現
4.1 RS232電平與TTL電平的轉換
PC機的串行接口是符合EIA RS-232C規範的外部總線標準接口,而RCM2200配備有四個串行接口,都是采用TTL電平,因此兩者之間必須進行電平轉換。以RCM2200的串行口C(位於核心模塊的J4插槽上)為例,電平轉換如圖2所示。

圖2 RS232與TTL電平轉換圖
4.2 使用Dynamic C實現串口數據的傳輸
Dynamic C提供了一些與計算機串行口進行通信的函數可供用戶程序調用,下麵簡要介紹其中的一部分。
4.2.1 打開串行接口
int serXopen( bard )
bard : 長整型,每秒鍾傳送的比特數。
該函數用於打開RCM2200的串行接口,由於RCM2200核心模塊擁有四個串行口,故X可根據需要取為A\B\C\D其中一個。在調用該函數之前,還必須先定義串行口的輸入輸出緩衝區大小,通常情況下設定為2n-1,否則就采用默認值31,但在編譯時會給出警告。該函數的返回值:成功則為1,否則為0。
4.2.2 讀取PC機串行口數據
int serXgetc() /* X = A|B|C|D */
程序可以調用該函數查詢串行口是否有字符來到,如果有,返回該字符值;否則,返回值-1。
4.2.3 發送數據到PC機串行口
int serXputs( *s )
int serXwrite( s, length ) /* X = A|B|C|D */
這兩個函數均可用於發送字符串給計算機的串行口,返回成功發送的字符數。
s : 待發送字符串的首地址;
length : 待發送字符串的長度。
4.2.4 關閉串行口
void serXclose() /* X = A|B|C|D */
該函數用於關閉已經打開的串行口。
5 實現以太網與串口之間的通信
5.1 定義網絡以及串口初始化數據
在程序的開頭,必須使用#define定義一些初始化數據,比如:RCM2200所使用的本地IP地址以及端口,與之通信的遠地IP地址以及端口以及串口輸入輸出緩衝區的大小等等。
5.2 主程序
在主程序中調用PC機串口發送字符串給RCM2200經過處理後再由RCM2200發送UDP報文給以太網以及RCM2200接收以太網發送來的UDP報文後再送給計算機的串行口兩個子程序。
main()
{ sock_init(); //初始化網絡庫函數: //打開串行口及網絡套接字for(;;;)
tcp_tick(NULL);//察看套接字狀態
init_comm();//網絡發報文串口接收
comm_init();//串口發數據網絡接收 }
5.3網絡發報文串口接收
子程序init_comm() 使用庫函數udp_recv查詢RCM2200以太網接口是否有UDP報文來到,如果沒有則返回主程序,否則將UDP報文存放到buf_init數組中,然後調用serCputs(buf_init)通過RCM2200的串行口C發送到計算機的串行口。值得一提的是,當RCM2200接收到了一次報文之後,它將自動關閉接收報文的套接字,因此,如果還想接受下一次發送的報文,必須再次調用函數udp_open打開該套接字。
5.4串口發字符串網絡接收
子程序 comm_init()調用函數serCgetc()用於查詢計算機的串行口是否有數據到來,如果沒有則返回主程序,否則將接收到的字符存儲到buf_comm數組中,直到檢測到結束符到來,將字符串以UDP報文的形式通過函數udp_send發送給以太網。如果發送成功,則返回主程序等待下一次數據的到來,否則關閉該套接字後重新打開再返回主程序等待。
5.5程序調試結果
在該程序的調試過程中,利用Visual C++語言編寫了一個接收和發送UDP報文的程序用於以太網的計算機上,另外還使用了從網上下載的串口調試幫助軟件,結果表明,該程序能實現基於RCM2200以太網與異步串口之間的成功通信。
結論
RCM2200是(shi)為(wei)了(le)促(cu)進(jin)嵌(qian)入(ru)式(shi)係(xi)統(tong)的(de)快(kuai)速(su)開(kai)發(fa)和(he)實(shi)現(xian)集(ji)成(cheng)的(de)以(yi)太(tai)網(wang)連(lian)接(jie)而(er)設(she)計(ji)的(de)。集(ji)成(cheng)的(de)以(yi)太(tai)網(wang)口(kou)允(yun)許(xu)用(yong)戶(hu)通(tong)過(guo)使(shi)用(yong)經(jing)濟(ji)的(de)網(wang)絡(luo)軟(ruan)件(jian)進(jin)行(xing)瞬(shun)間(jian)的(de)本(ben)地(di)連(lian)接(jie)或(huo)全(quan)球(qiu)範(fan)圍(wei)的(de)連(lian)接(jie)。另(ling)外(wai),RCM2200還提供了四個串行口用於和其他設備的串行口進行數據交換。
RCM2200使用Dynamic C軟件開發環境,支持C語言、彙編語言,擁有豐富的庫函數可供用戶調用,並具有單步編譯、斷點設置、單步執行、代碼分解、監視表達式等優秀性能。
使用Dynamic C接收和發送UDP報文時,由於網絡對該報文的傳輸不提供質量保證,在每完成一次操作後,必須及時檢查套接字的狀態,避免發生誤傳、漏傳以及套接字關閉等現象。在發送和接收串口數據時,要注意使RCM2200的串口數據傳輸波特率與PC機保持一致,這樣,才能保證正確傳輸。
參考文獻
【1】Z-World, Inc. RabbitCore RCM2200 User’s Manual 2001年
【2】Z-World, Inc. Dynamic C premier User’s Manual
1999年
【3】Z-World, Inc. Dynamic C TCP/IP software User’s Manual 2001年
【4】謝希仁.計算機網絡.第三版.大連: 大連理工大學出版社,2000.200~201.