基於STM32的MC20模塊GPRS+GPS的C語言驅動程序


 

  MC20 模塊是一款集成了高性能GNSS 引擎和四頻段GSM/GPRS 引擎的多功能無線模塊,本次在項目中使用MC20作為通信網關,開發其與服務器通信的功能以及定位功能,稍微學習了一下。

  1.硬件部分

  GSM/GPRS 部分主要特性:

  

  

 

 

  MC20模塊本身集成度較高,如果僅僅是使用的話其實非常簡單,只需要了解模塊內部的AT指令便可。

  MC20和STM32的接口采用UART,MC20上面有3個串口,分別用不同的功能,但我們項目的硬件設計把GPRS和GPS的串口都設計在了一起,因此只使用一個串口便可以實現通信與定位的功能。

  

    

  硬件不多講,直接下載官方的手冊參照設計即可,如果自己找不到手冊,可以聯系留下郵箱

  2.驅動部分

   初始化:

  MC20的初始化總體而言分為兩個大部分:1.GRRS初始化 2.GPS初始化

  首先解釋GPRS初始化:

  GPRS的初始化分為以下6個步驟:

  1.模塊硬件檢查

  2.SIM狀態檢查

  3.網絡狀態檢查

  4.GPRS信號強度檢查

  5.TCPIP傳送模式選擇

  6.建立TCP鏈接

 

  所謂硬件檢查,按照手冊上描述,其實就是檢查一下硬件有沒有正常啟動,在已經給電,並且通過脈沖激活了MC20的情況下,使用串口向MC20發送一個字符串“AT\r”

  發送字符串以后,會存在3種狀態,1.什么也沒收到 2.收到“OK” 3.收到其他字符串。

  有且只有在第二種的情況下才代表通信正常,由於STM32與MC20的通信幾乎都是這種一問一答的模式,因此特地做一個函數來進行這個工作的處理。

  函數功能:使用串口發送一個字符串:AT_CMD,然后等待,在wait_time_ms時間內如果串口有信息返回,那么就進行判斷,判斷返回信息中是否包含自己需要的字符串:return_value,如果有返回TRUE,如果沒有返回FALSE。

 1 uint8_t MC20_SendAtCmd(char *AT_CMD, char *return_value, uint32_t wait_time_ms)
 2 { 4     uint32_t time;
 5     uint8_t res;
 6 
 7     if(NULL == AT_CMD)
 8     {
 9         return 0;
10     }
11 
12     MC20_ClearFlag();
13     /* 發送命令 */
14     MC20_SendData((uint8_t *)AT_CMD, strlen(AT_CMD));
15     if(NULL == return_value)
16     {
17         return 1;
18     }
19 
20     time = u32SysTime;
21     /* 延時溢出 */
22     while(u32SysTime-time < wait_time_ms)
23     {
24         /* 收到模塊返回信息 */
25         if(1 == sMC20Rev.flag)
26         {   /* 比較接收到的字符串 */
29             res = Search_Str((uint8_t *)&sMC20Rev.buf[sMC20Rev.read], sMC20Rev.len,(uint8_t *)return_value, strlen(return_value));
30             MC20_ClearFlag();
31             if(1 == res)
32             {
33                 return 1;
34             }
35         }
36 
37     }
38 
39     return 0;
40 }

  

參數AT_CMD:STM32向MC20發送的命令(字符串)
參數return_value:如果一切正常,那么MC20應該返回的命令(字符串)

參數
wait_time_ms:延時時間(毫秒級別,使用系統滴答時鍾)

函數功能:使用串口向MC20發送一個指令,然后等待MC20返回應答,在規定的時間內如果接收到了希望的命令,那么返回TURE,否則返回FALSE。

函數MC20_ClearFlag的功能是清空一些flag,等MC20的串口中斷收到數據以后,會置位這些flag。
函數MC20_SendData的功能僅僅是包裝了一下串口發送的函數。
函數Search_Str的功能僅僅是檢查第一個字符串中是否包含第二個字符串的內容,可以簡單的理解為比較,這樣做是因為MC20返回的信息有時並不單純,很多時候我們需要的信息並不是第一個字符,比如當他返回字符串“OK”的時候,也許會在前后各添加一個換行符號,如果直接進行兩個字符串比較,結果肯定不同。
變量u32SysTime由系統滴答時鍾控制,我的是每毫秒增加,根據系統的負荷,可以自己調整。

----------------------------------------------------------------------------
初始化過程如下:
 1     /* 檢查模塊狀態 */
 2      for(i=0;i<5;i++)
 3      {
 4          res = MC20_SendAtCmd("AT", "OK", 500);
 5          if(1 == res)
 6          {
 7              return 1;
 8          }
 9          delay_ms(100);
10      }
11 
12     /* 檢查SIM卡狀態 */
13     time = u32SysTime;
14     while(1)
15     {
16         res = MC20_SendAtCmd("AT+CPIN?\r", "+CPIN: READY", 400);
17         if(1 == res)
18         {
19             break;
20         }
21         if(u32SysTime - time > 5000)
22         {
23             return ;
24         }
25         delay_ms(400);
26     }
27 
28     /* 檢查網絡狀態 */
29     time = u32SysTime;
30     while(1)
31     {
32         /* 檢查網絡狀態 本地網絡 */
33         res = MC20_SendAtCmd("AT+CREG?\r", "+CREG: 0,1", 400);
34         if(1 == res)
35         {
36             break;
37         }
38          /* 檢查網絡狀態 漫游 */
39         res = MC20_SendAtCmd("AT+CREG?\r", "+CREG: 0,5", 400);
40         if(1 == res)
41         {
42             break;
43         }
44         if(u32SysTime - time > 5000)
45         {
46             return ;
47         }
48         delay_ms(400);
49     }
50 
51     /* 檢查GPRS信號強度 */
52     time = u32SysTime;
53     while(1)
54     {
55         res = MC20_SendAtCmd("AT+CGATT?\r", "+CGATT: 1", 400);
56         if(1 == res)
57         {
58             break;
59         }
60         res = MC20_SendAtCmd("AT+CGATT?\r", "+CGATT: 5", 400);
61         if(1 == res)
62         {
63             break;
64         }
65         if(u32SysTime - time > 120000)
66         {
67             return ;
68         }
69         delay_ms(500);
70     }
71 
72     /* 選擇TCPIP傳送模式 */
73     res = MC20_SendAtCmd("AT+QIMODE=1\r", "OK", 600);
74     if(0 == res)
75     {
76         return ;
77     }

  當一切准備就緒之后,開始建立TCP連接。

  

 1     res = MC20_SendAtCmd("AT+QIOPEN=\"TCP\",\"114.55.114.201\",9088\r", "CONNECT\r", 60000);  // 具體數據格式請參考手冊
 2     if(1 == res)
 3     { 5         return 1;
 6     }
 7     else
 8     {10         return 0;
11     }

    如果連接建立成功,接下來就可以往服務器發送數據了,例如:MC20_SendData("Test", 5);發送一個測試命令。

 

 

 

 

 


  

 

 

  

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM