引言
微控制器" title="微控制器">微控制器以其體積小、功耗低、使用方便等特點,,廣泛應(yīng)用于各種工業(yè)、民用的嵌入式系統(tǒng)中,;而隨著互聯(lián)網(wǎng)" title="互聯(lián)網(wǎng)">互聯(lián)網(wǎng)(Internet)的興起與普及,,使微控制器通過互聯(lián)網(wǎng)傳送數(shù)據(jù)就變得非常有意義。目前使微控制器上網(wǎng)的解決方案一般有兩種:一種是采用微控制器驅(qū)動網(wǎng)卡,,通過以太網(wǎng)連接Internet,;另一種是使微控制器直接驅(qū)動調(diào)制解調(diào)器(MODEM)通過電話線向ISP撥號上網(wǎng)。這兩種方案的缺點在于都要使用有線的網(wǎng)絡(luò),,無法應(yīng)用于在邊遠(yuǎn)地區(qū)或可移動系統(tǒng)中,。
針對這一問題,本文提出一種基于GPRS" title="GPRS">GPRS的微控制器上網(wǎng)的解決方案,,即在微控制器中實現(xiàn)PPP協(xié)議,,并通過驅(qū)動GPRS模塊經(jīng)過GPRS無線網(wǎng)連接到Internet實現(xiàn)上網(wǎng)。這種方案的優(yōu)點在于:① 覆蓋面廣,,適用于廣大偏遠(yuǎn)地區(qū),;② 無線上網(wǎng),,適用于可移動目標(biāo);③使用廉價的微控制器實現(xiàn)簡單,、成本低,;④ 安裝簡便,維護方便,。
1 GPRS技術(shù)及其特點
GPRS(General Packet Radio Service)是通用分組無線業(yè)務(wù)的簡稱,,是在GSM基礎(chǔ)上發(fā)展起來的一種分組交換的數(shù)據(jù)承載和傳輸方式。與原有的GSM比較,,GPRS在數(shù)據(jù)業(yè)務(wù)的承載和支持上具有非常明顯的優(yōu)勢:通過多個GSM時隙的復(fù)用,,支持的數(shù)據(jù)傳輸速率更高,理論峰值達115kb/s,;不同的網(wǎng)絡(luò)用戶共享同一組GPRS信道,,但只有當(dāng)某一個用戶需要發(fā)送或接收數(shù)據(jù)時才會占用信道資源。這樣,,通過多用戶的業(yè)務(wù)復(fù)用,,更有效地利用無線網(wǎng)絡(luò)信道資源,特別適合突發(fā)性,、頻繁的小流量數(shù)據(jù)傳輸,,很好地適應(yīng)數(shù)據(jù)業(yè)務(wù)的突發(fā)性特點;GPRS計費方式更加靈活,,可以支持按數(shù)據(jù)流量來進行計費,;與無線應(yīng)用協(xié)議(WAP)技術(shù)不同,GPRS能夠隨時為用戶提供透明的IP通道,,可直接訪問Internet中的所有站點和資源,;采用信道復(fù)用技術(shù),,每一個GPRS用戶都能夠?qū)崿F(xiàn)永遠(yuǎn)在線,;另外,GPRS還能支持在進行數(shù)據(jù)傳輸?shù)耐瑫r進行語音通話等等,,而且相對于短消息等其它無線數(shù)據(jù)通信業(yè)務(wù),,GPRS的價格優(yōu)勢比較明顯。目前,,我國移動推出的GPRS上網(wǎng)業(yè)務(wù)最高每千字節(jié)也只有3分錢,,而且用戶可以根據(jù)自己的需要,以月租,、包月等多種形式進一步降低GPRS通信的費用,。
因此使用GPRS實現(xiàn)遠(yuǎn)程數(shù)據(jù)的傳送是非常經(jīng)濟實用的,特別是對于不易架設(shè)有線網(wǎng)絡(luò)的邊遠(yuǎn)地區(qū)和可移動裝置,。
2 硬件連接和GPRS模塊設(shè)置
通過GPRS網(wǎng)進行數(shù)據(jù)傳輸一般需要使用GPRS模塊,。目前,,GPRS模塊一般是指帶有GPRS功能的GSM模塊,可以利用GPRS網(wǎng)進行數(shù)據(jù)通信,。其中比較流行的有法國Wave公司的WISMO系列和西門子公司的S系列等等,。WAVECOM的WISMO模塊接口簡單、使用方便且功能非常強大,,它與微控制器,、SIM卡、電源之間的連接如圖1所示,。
圖1 GPRS模塊的硬件連接圖
其中GPRS模塊與微控制器間是通過串行口進行通信的,,通信速率最快可以達到115 200b/s。模塊與控制器間的通信協(xié)議是AT命令集,,其中大部分命令是符合協(xié)議“AT command set for GSM Mobile Equipment (ME) (GSM 07.07 version 6.4.0 Release 1997)”的,,但也有一些是Wavecom自己定義的AT命令。除了串口發(fā)送(TX),、串口接收(RX)之外,,微控制器與GPRS模塊之間還有一些硬件握手信號,如DTR,、CTS,、DCD等。為了簡化微控制器的控制,,硬件設(shè)計時沒有使用全部的硬件握手信號,,而只使用數(shù)據(jù)載波檢測(Data Carrier Detect, DCD)和終端準(zhǔn)備(Data Terminal Ready, DTR)信號。DCD信號可以檢測GPRS模塊是處于數(shù)據(jù)傳送狀態(tài)還是處于AT命令傳送狀態(tài),。DTR信號用來通知GPRS模塊傳送工作已經(jīng)結(jié)束,。
硬件連接完成后,在進行GPRS上網(wǎng)操作之前,,首先要對GPRS模塊進行一定的設(shè)置,。主要的設(shè)置工作有:① 設(shè)置通信波特率,可以使用AT+IPR=38400命令,,把波特率設(shè)為38 400b/s或其它合適的波特率,,默認(rèn)的通信速度為9600b/s。② 設(shè)置接入網(wǎng)關(guān),,通過AT+ CGD CONT=1, “IP”, “CMNET”命令設(shè)置GPRS接入網(wǎng)關(guān)為移動夢網(wǎng),。③設(shè)置移動終端的類別,通過AT+CGCLASS=“B”設(shè)置移動終端的類別為B類,,即同時監(jiān)控多種業(yè)務(wù),;但只能運行一種業(yè)務(wù),即在同一時間只能使用GPRS上網(wǎng),或者使用GSM的語音通信,。④ 測試GPRS服務(wù)是否開通,,使用AT+CGACT=1,1命令激活GPRS功能。如果返回OK,,則GPRS連接成功,;如果返回ERROR,則意味著GPRS失敗,。這時應(yīng)檢查一下SIM卡的GPRS業(yè)務(wù)是否已經(jīng)開通,,GPRS模塊天線是否安裝正確等問題。(其它相關(guān)的AT命令請參閱文獻3,。)
中國移動在GPRS與Internet網(wǎng)中間建立了許多相當(dāng)于ISP的網(wǎng)關(guān)支持節(jié)點(GGSN),,以連接GPRS網(wǎng)與外部的Internet網(wǎng)。GPRS模塊可以通過撥“*99***1#”登錄到GGSN上動態(tài)分配到Internet網(wǎng)的IP地址,。其間GPRS模塊與網(wǎng)關(guān)的通信要符合點對點協(xié)議" title="點對點協(xié)議">點對點協(xié)議(Point to Point Protocol, PPP),,其中身份驗證時用戶名、密碼都為空,。使用PPP協(xié)議登錄上之后,,就可以通過GGSN接上Internet了。
3.1 軟件層次結(jié)構(gòu)
程序中的所有代碼都是由C語言編寫的,,并采用分層的結(jié)構(gòu),,從底到上分別為:串口驅(qū)動層、GPRS模塊驅(qū)動層,、PPP協(xié)議層,、IP協(xié)議層、UDP協(xié)議層與應(yīng)用層,。上層函數(shù)的實現(xiàn)需要應(yīng)用到底層函數(shù),,而底層函數(shù)的任務(wù)就是為上層函數(shù)提供服務(wù),最終完成應(yīng)用層任務(wù)——傳送數(shù)據(jù),。各層的主要函數(shù)如圖2所示,。
圖2 軟件層次結(jié)構(gòu)
3.2 驅(qū)動程序編寫
首先是串行口驅(qū)動層。它實現(xiàn)打開串口(OpenComm),、關(guān)閉串口(CloseComm),、讀串口數(shù)據(jù)(ReadComm),、寫串口數(shù)據(jù)(WriteComm)等函數(shù),。例如WriteComm函數(shù)向串口發(fā)送一個字節(jié)的數(shù)據(jù),而transmit函數(shù)向串口發(fā)送一個字符串的數(shù)據(jù):
void WriteComm(char c){
ES = 0;
SBUF = c;
while(TI==0);
TI=0;
ES = 1;
}
void transmit (char *data) {
Delay (250);
while (*data) {
WriteComm (*data++);
}
}
然后,,在這些串口函數(shù)的基礎(chǔ)上編寫GPRS模塊的驅(qū)動函數(shù),。微控制器通過串行口控制GPRS模塊,進行撥號、設(shè)置等操作,??刂频姆椒ㄊ遣捎肁T命令。在控制GPRS模塊撥打移動夢網(wǎng)GGSN的登錄號碼“*99***1#”之后,,GPRS模塊就轉(zhuǎn)入在線模式(On-Line),。此時微控制器向串行口發(fā)送的所有數(shù)據(jù)都透明地傳送給了GGSN,同樣GGSN的回答也傳回單片機的串行口,。當(dāng)數(shù)據(jù)傳送完成后,,微控制器需要通知GPRS模塊結(jié)束會話,并從在線模式轉(zhuǎn)回普通的命令模式,,這可以通過置高DTR線完成,。同時,如果線路由于異常斷開,,CD線會回復(fù)到平常的低電平,,所以處于在線模式下也要不斷檢測CD線是否處于高電平。根據(jù)這些操作,,可以編寫GPRS驅(qū)動函數(shù):初始化GPRS模塊函數(shù)(GPRSInit),、撥號函數(shù)(GPRSDial)、斷開連接函數(shù)(GPRSHangup),、檢測是否處于在線狀態(tài)函數(shù)(GPRSOnline),。其中,GPRS的撥號和掛斷代碼如下:
BYTE GPRSDial (void) {
signed char delayCount = 80;
transmit ("ATV0\r"); // 要求返回數(shù)字表示的回答
if (!Waitfor ("0", 30)) { // 等待 OK 回答
return -1;
}
DTR_ON;
transmit ("ATD*99***1#\r"); // 撥GGSN的號碼
GPRSBuffFlush (); // 清空buffer
// 等待回答
while ((!GPRSBuffNotEmpty()) && (--delayCount > 0)) {
Delay (250);
}
if (delayCount) {
return GPRSGetch (); // 返回回答的數(shù)字
}
return -1; // 沒有返回,,錯誤
}
void GPRSHangup (void) {
DTR_ON; // 置高DTR
Delay (40); // 保持一定時間
DTR_OFF; // 完成連接的斷開
}
這些底層的驅(qū)動函數(shù)將會使上層協(xié)議的編寫很方便,,更重要的是,它為我們提供了一個驅(qū)動抽象層,。當(dāng)?shù)讓佑布龀龈膭拥臅r候,,只需要對底層的驅(qū)動函數(shù)進行改動,而上層函數(shù)的代碼不變,。