新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 微控制器的GPRS無線上網方案

        微控制器的GPRS無線上網方案

        作者: 時間:2009-07-17 來源:網絡 收藏

          其中模塊與微間是通過串行口進行通信的,通信速率最快可以達到115 200b/s。模塊與間的通信協議是AT命令集,其中大部分命令是符合協議“AT command set for GSM Mobile Equipment (ME) (GSM 07.07 version 6.4.0 Release 1997)”的,但也有一些是Wavecom自己定義的AT命令。除了串口發送(TX)、串口接收(RX)之外,微模塊之間還有一些硬件握手信號,如DTR、CTS、DCD等。為了簡化微控制器的控制,硬件設計時沒有使用全部的硬件握手信號,而只使用數據載波檢測(Data Carrier Detect, DCD)和終端準備(Data Terminal Ready, DTR)信號。DCD信號可以檢測模塊是處于數據傳送狀態還是處于AT命令傳送狀態。DTR信號用來通知GPRS模塊傳送工作已經結束。

        本文引用地址:http://www.104case.com/article/157972.htm

          硬件連接完成后,在進行GPRS操作之前,首先要對GPRS模塊進行一定的設置。主要的設置工作有:① 設置通信波特率,可以使用AT+IPR=38400命令,把波特率設為38 400b/s或其它合適的波特率,默認的通信速度為9600b/s。② 設置接入網關,通過AT+ CGD CONT=1, “IP”, “CMNET”命令設置GPRS接入網關為移動夢網。③設置移動終端的類別,通過AT+CGCLASS=“B”設置移動終端的類別為B類,即同時監控多種業務;但只能運行一種業務,即在同一時間只能使用GPRS,或者使用GSM的語音通信。④ 測試GPRS服務是否開通,使用AT+CGACT=1,1命令激活GPRS功能。如果返回OK,則GPRS連接成功;如果返回ERROR,則意味著GPRS失敗。這時應檢查一下SIM卡的GPRS業務是否已經開通,GPRS模塊天線是否安裝正確等問題。(其它相關的AT命令請參閱文獻3。)

          中國移動在GPRS與Internet網中間建立了許多相當于ISP的網關支持節點(GGSN),以連接GPRS網與外部的Internet網。GPRS模塊可以通過撥“*99***1#”登錄到GGSN上動態分配到Internet網的IP地址。其間GPRS模塊與網關的通信要符合點對點協議(Point to Point Protocol, PPP),其中身份驗證時用戶名、密碼都為空。使用PPP協議登錄上之后,就可以通過GGSN接上Internet了。

        3 軟件整體結構

        3.1 軟件層次結構

          程序中的所有代碼都是由C語言編寫的,并采用分層的結構,從底到上分別為:串口驅動層、GPRS模塊驅動層、PPP協議層、IP協議層、UDP協議層與應用層。上層函數的實現需要應用到底層函數,而底層函數的任務就是為上層函數提供服務,最終完成應用層任務――傳送數據。各層的主要函數如圖2所示。


        圖2 軟件層次結構


        3.2 驅動程序編寫

          首先是串行口驅動層。它實現打開串口(OpenComm)、關閉串口(CloseComm)、讀串口數據(ReadComm)、寫串口數據(WriteComm)等函數。例如WriteComm函數向串口發送一個字節的數據,而transmit函數向串口發送一個字符串的數據:

        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++);
          }
        }

          然后,在這些串口函數的基礎上編寫GPRS模塊的驅動函數。微控制器通過串行口控制GPRS模塊,進行撥號、設置等操作。控制的方法是采用AT命令。在控制GPRS模塊撥打移動夢網GGSN的登錄號碼“*99***1#”之后,GPRS模塊就轉入在線模式(On-Line)。此時微控制器向串行口發送的所有數據都透明地傳送給了GGSN,同樣GGSN的回答也傳回單片機的串行口。當數據傳送完成后,微控制器需要通知GPRS模塊結束會話,并從在線模式轉回普通的命令模式,這可以通過置高DTR線完成。同時,如果線路由于異常斷開,CD線會回復到平常的低電平,所以處于在線模式下也要不斷檢測CD線是否處于高電平。根據這些操作,可以編寫GPRS驅動函數:初始化GPRS模塊函數(GPRSInit)、撥號函數(GPRSDial)、斷開連接函數(GPRSHangup)、檢測是否處于在線狀態函數(GPRSOnline)。其中,GPRS的撥號和掛斷代碼如下:

        BYTE GPRSDial (void) {
          signed char delayCount = 80;
          transmit (ATV0r); // 要求返回數字表示的回答
          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 (); // 返回回答的數字
          }
          return -1; // 沒有返回,錯誤
        }

        void GPRSHangup (void) {
          DTR_ON; // 置高DTR
          Delay (40); // 保持一定時間
          DTR_OFF; // 完成連接的斷開
        }

          這些底層的驅動函數將會使上層協議的編寫很方便,更重要的是,它為我們提供了一個驅動抽象層。當底層硬件做出改動的時候,只需要對底層的驅動函數進行改動,而上層函數的代碼不變。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大洼县| 天等县| 虎林市| 佛坪县| 灵寿县| 资兴市| 库车县| 彭泽县| 富顺县| 临汾市| 衢州市| 浦江县| 方城县| 长沙县| 中江县| 大埔县| 孟津县| 嘉兴市| 南平市| 突泉县| 宿迁市| 任丘市| 威信县| 宜城市| 卢湾区| 岚皋县| 平远县| 海淀区| 柳州市| 保亭| 株洲市| 贡山| 巴东县| 元朗区| 龙游县| 汝南县| 银川市| 安吉县| 长兴县| 商河县| 伊川县|