《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 利用RCM2200實(shí)現(xiàn)以太網(wǎng)與異步串口的通信

利用RCM2200實(shí)現(xiàn)以太網(wǎng)與異步串口的通信

2008-04-14
作者:譚姝 宋茂忠

摘? 要:本文研究基于RCM2200嵌入式系統(tǒng)對網(wǎng)絡(luò)和串口" title="串口">串口的編程技術(shù),。介紹了RCM2200微控制器核心模塊以及Dynamic C軟件開發(fā)環(huán)境,,講述了如何利用Dynamic C語言通過RCM2200核心模塊實(shí)現(xiàn)UDP報(bào)文和異步串口數(shù)據(jù)的互相轉(zhuǎn)換,。DynamicC是與RCM2200配套使用的軟件開發(fā)語言,,它擁有豐富的庫函數(shù)以便程序員編程時調(diào)用,結(jié)果表明,,運(yùn)用該語言能實(shí)現(xiàn)基于RCM2200以太網(wǎng)與異步串口之間的成功通信,。
關(guān)鍵詞:嵌入式系統(tǒng),;RCM2200,;UDP報(bào)文,;串口通信


1 引言
??? 目前,嵌入式技術(shù)已經(jīng)廣泛滲入并應(yīng)用到各領(lǐng)域,,涉及到多種傳統(tǒng)及現(xiàn)代技術(shù),,形成了前所未有的多學(xué)科、多領(lǐng)域的交叉與融合,。由Z-World公司推出的RCM2200[1]是一款低成本的嵌入式微控制器核心模塊,,它采用Dynamic C?[2]這一專門為Z-World產(chǎn)品創(chuàng)建的集成的C 編譯器、編輯器,、鏈接器,、裝載器和調(diào)試器,便于實(shí)現(xiàn)快速開發(fā)應(yīng)用,,加快產(chǎn)品投放到市場,。
??? UDP協(xié)議[3][4]是比較著名的傳輸層協(xié)議之一,,它與TCP協(xié)議一樣是基于IP協(xié)議的,,但與TCP不同的是它不需要協(xié)議層提供質(zhì)量保證,因此,,在需要實(shí)時數(shù)據(jù)傳輸?shù)那闆r下應(yīng)用比較廣泛,。并且,因?yàn)椴惶峁┵|(zhì)量保證,,服務(wù)器沒有必要一直處于等待狀態(tài),,從而大大減輕了服務(wù)器的負(fù)擔(dān)。在某些情況下,,還可以根據(jù)需要給UDP報(bào)文加上一些質(zhì)量保證控制,,有很大的靈活度,。
??? 在不遠(yuǎn)的將來,將設(shè)備與網(wǎng)絡(luò)相連將成為一種趨勢,。在諸如GPS串口數(shù)據(jù)網(wǎng)絡(luò)收發(fā)以及某些語音傳輸,、實(shí)時監(jiān)控等多種場合,實(shí)現(xiàn)以太網(wǎng)與異步串口數(shù)據(jù)之間的通信是非常必要的,。本文介紹了一種基于RCM2200嵌入式微控制器核心模塊利用UDP報(bào)文實(shí)現(xiàn)網(wǎng)絡(luò)與串口互通的方法,,可以迅速實(shí)現(xiàn)將串口與網(wǎng)絡(luò)相連接。
2?系統(tǒng)原理及功能
??? RCM2200采用Rabbit半導(dǎo)體公司推出的高性能8位器件-Rabbit2000型微處理器,;帶RJ-45插口的內(nèi)置10Base-T端口簡化了網(wǎng)絡(luò)連接,,便于開發(fā)帶以太網(wǎng)接口的監(jiān)控、通訊設(shè)備,;配備有4個串行口,,方便擴(kuò)展聯(lián)接;擁有26根并行的I/O引線以及16根可設(shè)置的I/O引線,,無須擴(kuò)展即可完成一般的I/O任務(wù),;擁有256K Flash,128K SRAM, 用于代碼存儲和數(shù)據(jù)存儲;時間,、日期,、看門狗、定時器等一應(yīng)俱全,;且其采用雙列直插式引腳,,尺寸僅為59 x 41 x 22 mm。這種結(jié)構(gòu)促進(jìn)了嵌入式系統(tǒng)的快速開發(fā),,并可實(shí)現(xiàn)集成的以太網(wǎng)連接,。
??? RCM2200系統(tǒng)的基本框架結(jié)構(gòu)如圖1所示。

?

?

圖1? RCM2200系統(tǒng)結(jié)構(gòu)


??? RCM2200采用Dynamic C?語言進(jìn)行軟件開發(fā),,與標(biāo)準(zhǔn)C語言相比,,Dynamic C的改進(jìn)和差異在于使得在功能強(qiáng)大的嵌入式系統(tǒng)上進(jìn)行實(shí)時編程變得非常容易。 語言的擴(kuò)展包括多任務(wù)和優(yōu)先多任務(wù)的構(gòu)造,,當(dāng)供電失敗時,,能夠保護(hù)寫入變量, 能夠?qū)懭氲街袛喑绦蛑腥?。?biāo)準(zhǔn)C函數(shù)庫,,特定板的外圍驅(qū)動,芯片外圍設(shè)備,,以及其他的性能以源代碼的形式包含在Dynamic C中,。完全支持匯編語言,在對時間要求較高的應(yīng)用中,,匯編代碼可以方便的與C代碼混用,。
??? 在該開發(fā)系統(tǒng)中將RCM2200的以太網(wǎng)接口與當(dāng)?shù)鼐钟蚓W(wǎng)相連,,選擇一個串口與計(jì)算機(jī)的串口相連。由以太網(wǎng)發(fā)送UDP報(bào)文給RCM2200微控制器核心模塊經(jīng)過處理后通過串口發(fā)送給計(jì)算機(jī),,由計(jì)算機(jī)串口發(fā)送數(shù)據(jù)給RCM2200微控制器核心模塊經(jīng)過處理后通過其上的網(wǎng)絡(luò)口發(fā)送UDP報(bào)文給以太網(wǎng),,從而實(shí)現(xiàn)基于RCM2200以太網(wǎng)和串口之間的通信。
3?UDP協(xié)議的實(shí)現(xiàn)
??? UDP協(xié)議是比較著名的傳輸層協(xié)議之一,,它使用IP作為網(wǎng)絡(luò)層協(xié)議,,為應(yīng)用程序發(fā)送和接收數(shù)據(jù)報(bào)。但是,,它提供無連接服務(wù),,是不可靠傳輸。因此,,UDP報(bào)文主要用于需要實(shí)時數(shù)據(jù)傳輸?shù)那闆r,,一次傳輸少量的數(shù)據(jù)。在某些對實(shí)時性要求很高的場合,,利用UDP報(bào)文進(jìn)行數(shù)據(jù)傳輸是非常必要的,,但往往要采用一些可靠性方案,以防止有漏傳,、誤傳的現(xiàn)象發(fā)生,。
3.1 客戶機(jī)/服務(wù)器程序設(shè)計(jì)模式
??? 客戶機(jī)/服務(wù)器的程序設(shè)計(jì)模式在網(wǎng)絡(luò)程序設(shè)計(jì)中被大量的應(yīng)用。這種設(shè)計(jì)模式將整個系統(tǒng)分為兩大部分——服務(wù)器部分和客戶機(jī)部分,??蛻魴C(jī)向服務(wù)器提出請求,服務(wù)器對請求作相應(yīng)的處理將結(jié)果返回給客戶機(jī),。
??? 根據(jù)不同的實(shí)際情況,,客戶機(jī)/服務(wù)器的通信存在對稱和非對稱兩種方式。在對稱的方式下,,通信的每一方都可能扮演主從角色,;在非對稱的方式下,一方不可改變的認(rèn)為是主機(jī),,而另一方則是從機(jī),。無論是對稱的或是非對稱的,當(dāng)服務(wù)被提供時必然存在客戶進(jìn)程和服務(wù)進(jìn)程,?;赨DP協(xié)議的通信既可采用對稱方式也可采用非對稱方式,。
3.2?數(shù)據(jù)報(bào)套接字
??? 套接字" title="套接字">套接字(socket)是通信的基石,,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,,本地主機(jī)的IP地址,,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地" title="遠(yuǎn)地">遠(yuǎn)地主機(jī)的IP地址,,遠(yuǎn)地進(jìn)程的協(xié)議端口,。
??? UDP協(xié)議支持?jǐn)?shù)據(jù)報(bào)套接字。這種套接字可以采用客戶/服務(wù)器模式,,以全雙工方式工作,,接收發(fā)送可以同時進(jìn)行,但并不保證數(shù)據(jù)傳輸?shù)目煽啃?、有序性和無重復(fù)性,,需要由程序員負(fù)責(zé)管理數(shù)據(jù)報(bào)的排序和可靠性。
3.3? 使用Dynamic C實(shí)現(xiàn)UDP報(bào)文的傳輸
??? Dynamic C提供了許多支持TCP/IP協(xié)議的庫函數(shù),。其中,,DCRTCP.LIB是最主要的函數(shù)庫。
下面將簡要介紹UDP協(xié)議下的基本通信流程,。
3.3.1? 調(diào)用本地初始化函數(shù)
void sock_init(void)
??? 該函數(shù)將使用默認(rèn)配置初始化本地信息包驅(qū)動器以及DCRTCP.LIB函數(shù)庫,。該函數(shù)必須在其他網(wǎng)絡(luò)庫函數(shù)被使用前進(jìn)行調(diào)用。
3.3.2? 打開數(shù)據(jù)報(bào)套接字
int udp_open( *s, lport, remote_IP, port, *data_handler ())
其中的參數(shù)解釋如下:
s : 指向UDP套接字的指針,;
lport : 本地協(xié)議端口,;
remote_IP : 可接受的遠(yuǎn)地主機(jī)IP地址,如果該項(xiàng)為-1,,則支持廣播通信,;
port : 可接受的遠(yuǎn)地進(jìn)程協(xié)議端口,如果該項(xiàng)為-1,,則為廣播數(shù)據(jù)報(bào),;
data_handler() : 如果接收到數(shù)據(jù)則調(diào)用該函數(shù);
該函數(shù)的返回值,,如果成功返回非零,,否則返回零值。
3.3.3? 接收遠(yuǎn)地主機(jī)發(fā)送的數(shù)據(jù)報(bào)
int udp_recv( *s, *buf_recv, recv_len)
??? 當(dāng)套接字初始化后用該函數(shù)掃描接收緩沖區(qū),,,,察看是否有數(shù)據(jù)報(bào)到達(dá)。其中,,buf_recv : 指向用于存放已到達(dá)數(shù)據(jù)報(bào)的數(shù)組的指針,;recv_len : 存放數(shù)據(jù)報(bào)的數(shù)組的大小。如果接收到數(shù)據(jù)報(bào)則返回?cái)?shù)據(jù)報(bào)的長度,;否則返回-1,。
3.3.4? 發(fā)送數(shù)據(jù)報(bào)給遠(yuǎn)地主機(jī)
?int udp_send( *s, *buf_send, send_len )
?調(diào)用該函數(shù)發(fā)送數(shù)據(jù)報(bào)給遠(yuǎn)地主機(jī)。如果成功返回該數(shù)據(jù)報(bào)的長度,否則返回-1,。
?buf_send : 指向待發(fā)送數(shù)據(jù)報(bào)的指針,;
send_len : 待發(fā)送數(shù)據(jù)報(bào)的長度。
3.3.5? 網(wǎng)絡(luò)信息處理函數(shù)
int tcp_tick( *s )
??? 該函數(shù)將察看網(wǎng)絡(luò)連接狀態(tài),,檢查數(shù)據(jù)報(bào)的到達(dá)情況,,處理新到數(shù)據(jù)報(bào)并重傳丟失的數(shù)據(jù)報(bào)。若出現(xiàn)網(wǎng)絡(luò)連接被復(fù)位及套接字已關(guān)閉的情況或參量s為NULL,,則返回值為零,;否則返回非零值。
3.3.6? 關(guān)閉套接字
void sock_close( *s )
??? 當(dāng)數(shù)據(jù)傳送工作完成或傳送過程中發(fā)生錯誤時,,可調(diào)用該函數(shù)關(guān)閉套接字
4?串口通信的實(shí)現(xiàn)
4.1? RS232電平與TTL電平的轉(zhuǎn)換
??? PC機(jī)的串行接口" title="串行接口">串行接口是符合EIA RS-232C規(guī)范的外部總線標(biāo)準(zhǔn)接口,,而RCM2200配備有四個串行接口,都是采用TTL電平,,因此兩者之間必須進(jìn)行電平轉(zhuǎn)換,。以RCM2200的串行口C(位于核心模塊的J4插槽上)為例,電平轉(zhuǎn)換如圖2所示,。

?

?

圖2? RS232與TTL電平轉(zhuǎn)換圖


4.2? 使用Dynamic C實(shí)現(xiàn)串口數(shù)據(jù)的傳輸
??? Dynamic C提供了一些與計(jì)算機(jī)串行口進(jìn)行通信的函數(shù)可供用戶程序調(diào)用,,下面簡要介紹其中的一部分。
4.2.1? 打開串行接口
int serXopen( bard )
bard : 長整型,,每秒鐘傳送的比特?cái)?shù),。
??? 該函數(shù)用于打開RCM2200的串行接口,由于RCM2200核心模塊擁有四個串行口,,故X可根據(jù)需要取為A\B\C\D其中一個,。在調(diào)用該函數(shù)之前,還必須先定義串行口的輸入輸出緩沖區(qū)大小,,通常情況下設(shè)定為2n-1,,否則就采用默認(rèn)值31,但在編譯時會給出警告,。該函數(shù)的返回值:成功則為1,,否則為0。
4.2.2? 讀取PC機(jī)串行口數(shù)據(jù)
int serXgetc()?????? /* X = A|B|C|D */
??? 程序可以調(diào)用該函數(shù)查詢串行口是否有字符來到,,如果有,,返回該字符值;否則,,返回值-1,。
4.2.3? 發(fā)送數(shù)據(jù)到PC機(jī)串行口
?int serXputs( *s )
?int serXwrite( s, length )? /* X = A|B|C|D */
??? 這兩個函數(shù)均可用于發(fā)送字符串給計(jì)算機(jī)的串行口,返回成功發(fā)送的字符數(shù),。
s : 待發(fā)送字符串的首地址,;
length : 待發(fā)送字符串的長度。
4.2.4? 關(guān)閉串行口
void serXclose()???? /* X = A|B|C|D */
該函數(shù)用于關(guān)閉已經(jīng)打開的串行口。
5?實(shí)現(xiàn)以太網(wǎng)與串口之間的通信
5.1?定義網(wǎng)絡(luò)以及串口初始化數(shù)據(jù)
??? 在程序的開頭,,必須使用#define定義一些初始化數(shù)據(jù),,比如:RCM2200所使用的本地IP地址以及端口,,與之通信的遠(yuǎn)地IP地址以及端口以及串口輸入輸出緩沖區(qū)的大小等等,。
5.2 主程序" title="主程序">主程序
??? 在主程序中調(diào)用PC機(jī)串口發(fā)送字符串給RCM2200經(jīng)過處理后再由RCM2200發(fā)送UDP報(bào)文給以太網(wǎng)以及RCM2200接收以太網(wǎng)發(fā)送來的UDP報(bào)文后再送給計(jì)算機(jī)的串行口兩個子程序。
main()
{????? sock_init(); //初始化網(wǎng)絡(luò)庫函數(shù):?? //打開串行口及網(wǎng)絡(luò)套接字for(;;;)
?????? tcp_tick(NULL);//察看套接字狀態(tài)
?????? init_comm();//網(wǎng)絡(luò)發(fā)報(bào)文串口接收
?????? comm_init();//串口發(fā)數(shù)據(jù)網(wǎng)絡(luò)接收?? }
5.3網(wǎng)絡(luò)發(fā)報(bào)文串口接收
??? 子程序init_comm() 使用庫函數(shù)udp_recv查詢RCM2200以太網(wǎng)接口是否有UDP報(bào)文來到,,如果沒有則返回主程序,,否則將UDP報(bào)文存放到buf_init數(shù)組中,然后調(diào)用serCputs(buf_init)通過RCM2200的串行口C發(fā)送到計(jì)算機(jī)的串行口,。值得一提的是,,當(dāng)RCM2200接收到了一次報(bào)文之后,它將自動關(guān)閉接收報(bào)文的套接字,,因此,,如果還想接受下一次發(fā)送的報(bào)文,必須再次調(diào)用函數(shù)udp_open打開該套接字,。
5.4串口發(fā)字符串網(wǎng)絡(luò)接收
??? 子程序 comm_init()調(diào)用函數(shù)serCgetc()用于查詢計(jì)算機(jī)的串行口是否有數(shù)據(jù)到來,,如果沒有則返回主程序,否則將接收到的字符存儲到buf_comm數(shù)組中,,直到檢測到結(jié)束符到來,,將字符串以UDP報(bào)文的形式通過函數(shù)udp_send發(fā)送給以太網(wǎng)。如果發(fā)送成功,,則返回主程序等待下一次數(shù)據(jù)的到來,,否則關(guān)閉該套接字后重新打開再返回主程序等待。
5.5程序調(diào)試結(jié)果
??? 在該程序的調(diào)試過程中,,利用Visual C++語言編寫了一個接收和發(fā)送UDP報(bào)文的程序用于以太網(wǎng)的計(jì)算機(jī)上,,另外還使用了從網(wǎng)上下載的串口調(diào)試幫助軟件,結(jié)果表明,,該程序能實(shí)現(xiàn)基于RCM2200以太網(wǎng)與異步串口之間的成功通信,。
結(jié)論
??? RCM2200是為了促進(jìn)嵌入式系統(tǒng)的快速開發(fā)和實(shí)現(xiàn)集成的以太網(wǎng)連接而設(shè)計(jì)的。集成的以太網(wǎng)口允許用戶通過使用經(jīng)濟(jì)的網(wǎng)絡(luò)軟件進(jìn)行瞬間的本地連接或全球范圍的連接,。另外,,RCM2200還提供了四個串行口用于和其他設(shè)備的串行口進(jìn)行數(shù)據(jù)交換。
??? RCM2200使用Dynamic C軟件開發(fā)環(huán)境,,支持C語言,、匯編語言,擁有豐富的庫函數(shù)可供用戶調(diào)用,,并具有單步編譯,、斷點(diǎn)設(shè)置、單步執(zhí)行、代碼分解,、監(jiān)視表達(dá)式等優(yōu)秀性能,。
??? 使用Dynamic C接收和發(fā)送UDP報(bào)文時,由于網(wǎng)絡(luò)對該報(bào)文的傳輸不提供質(zhì)量保證,,在每完成一次操作后,,必須及時檢查套接字的狀態(tài),避免發(fā)生誤傳,、漏傳以及套接字關(guān)閉等現(xiàn)象,。在發(fā)送和接收串口數(shù)據(jù)時,要注意使RCM2200的串口數(shù)據(jù)傳輸波特率與PC機(jī)保持一致,,這樣,,才能保證正確傳輸。
參考文獻(xiàn)
【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】謝希仁.計(jì)算機(jī)網(wǎng)絡(luò).第三版.大連: 大連理工大學(xué)出版社,,2000.200~201.

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]