標(biāo)題: SIM系列GSM GPRS模塊例程(STM32源碼) [打印本頁]

作者: 巽風(fēng)    時(shí)間: 2018-5-15 12:50
標(biāo)題: SIM系列GSM GPRS模塊例程(STM32源碼)


stm32源碼列表:
1.撥打電話
10.GPRS_透?jìng)髂J?br /> 11.綜合演示程序STM32
12.GPS測(cè)試程序
13.藍(lán)牙測(cè)試程序
14.手機(jī)通過藍(lán)牙控制LED
2.接聽電話
3.發(fā)送TEXT短信
4.發(fā)送中文短信
5.接收短信控制LED燈
6.GPRS_TCP程序(動(dòng)態(tài)IP)
7.GPRS_TCP程序(域名)
8.GPRS_UDP程序(動(dòng)態(tài)IP)
9.GPRS_UDP程序(域名)

本程序通過GPRS服務(wù)器控制LED的亮滅
使用單片機(jī)串口2與模塊通信;接法如下
    STM32      GPRS模塊
    PA3 (RXD2)->RXD
    PA2 (TXD2)->TXD
    GND      ->GND
1、1、板子上電后運(yùn)行指示燈RUNING_LED會(huì)以一秒的頻率閃爍;
2、通過單片機(jī)的串口1,可以監(jiān)視模塊的登錄情況;
3、手機(jī)發(fā)送“onled”點(diǎn)亮LED;
4、手機(jī)發(fā)送“offled”熄滅LED;
5、單片機(jī)每隔10秒會(huì)向服務(wù)器發(fā)送心跳幀“OK”
6、通過串口助手監(jiān)控單片機(jī)的串口1可以看到服務(wù)器發(fā)送的信息;

單片機(jī)源程序如下:
  1. /**********************************************************************************
  2. * 工程名  :GPRS_透?jìng)髂J?br />
  3. * 描述    :通過STM32開發(fā)板控制模塊進(jìn)入透?jìng)髂J,連接上服務(wù)器后將收到服務(wù)器的數(shù)據(jù)返回給服務(wù)器
  4. * 實(shí)驗(yàn)平臺(tái):STM32F10X
  5. * 庫版本  :


  6. * 硬件連接說明
  7.          使用單片串口2與GPRS模塊通信  注:使用串口2可以避免下載和通信不會(huì)沖突
  8.          STM32      GPRS模塊
  9.          PA3 (RXD2)->TXD
  10.          PA2 (TXD2)->RXD
  11.          GND              ->GND

  12. * 軟件功能說明
  13.    板子上電后運(yùn)行指示燈RUNING_LED會(huì)以一秒的頻率閃爍
  14.          連接上服務(wù)器后將收到服務(wù)器的數(shù)據(jù)返回給服務(wù)器
  15. **********************************************************************************/

  16. #include "stm32f10x.h"
  17. #include "usart.h"
  18. #include "Led.h"
  19. #include "SysTick.h"
  20. #include "timer.h"
  21. #include "string.h"

  22. #define Buf2_Max 200                                           //串口2緩存長(zhǎng)度
  23. /*************        本地常量聲明        **************/
  24. const char *string = "AT+CIPSTART=\"TCP\",\"14.125.48.205\",9015";//IP登錄服務(wù)器,需要根據(jù)自己的IP和端口做修改

  25. /*************  本地變量聲明        **************/

  26. char Uart2_Buf[Buf2_Max]; //串口2接收緩存
  27. char *p1,*p2;            
  28. u8 Times=0,shijian=0;

  29. vu8 Timer0_start;        //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器

  30. /*************        本地函數(shù)聲明        **************/
  31. void System_Initialization(void); //STM32系統(tǒng)初始化
  32. void Ram_Initialization(void);    //內(nèi)存變量初始化
  33. void NVIC_Configuration(void);    //中斷向量組初始化
  34. void CLR_Buf2(void);              //清串口2接收緩存
  35. u8 Find(char *a);                 //查找字符串
  36. void Second_AT_Command(char *b,char *a,u8 wait_time);  //發(fā)送AT指令
  37. void Wait_CREG(void);                          //查詢等待模塊注冊(cè)成功
  38. void Set_ATE0(void);                           //取消回顯
  39. void Connect_Server(void);                     //配置GPRS連接參數(shù),并進(jìn)入透?jìng)髂J?br />
  40. void Rec_Server_Data(void);                    //接收服務(wù)器數(shù)據(jù)并返回


  41. /*************  外部函數(shù)和變量聲明*****************/




  42. /*******************************************************************************
  43. * 函數(shù)名 : main
  44. * 描述   : 主函數(shù)
  45. * 輸入   :
  46. * 輸出   :
  47. * 返回   :
  48. * 注意   : 串口2負(fù)責(zé)與MG323模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時(shí)數(shù)據(jù)
  49.                                          還發(fā)送到模塊
  50. *******************************************************************************/
  51. int main(void)
  52. {
  53.         System_Initialization(); //系統(tǒng)初始化
  54.         Ram_Initialization();    //變量初始化

  55.         UART1_SendString("GPRS模塊GPRS測(cè)試程序\r\n");
  56.         UART1_SendString("GPRS模塊在注冊(cè)網(wǎng)絡(luò)\r\n");
  57.         Delay_nS(1);
  58.         UART2_SendString("+++");//退出透?jìng)髂J,避免模塊還處于透?jìng)髂J街?br />
  59.   Delay_nS(2);
  60.         Wait_CREG();   //等待模塊注冊(cè)成功
  61.         UART1_SendString("GPRS模塊注冊(cè)成功\r\n");
  62.         UART1_SendString("GPRS模塊開始連接服務(wù)器\r\n");
  63.         Set_ATE0();    //取消回顯
  64.         Connect_Server(); //設(shè)置GPRS參數(shù)
  65.         UART1_SendString("連接成功\r\n");

  66.         while(1)
  67.         {
  68.                 Rec_Server_Data();//接收數(shù)據(jù)并原樣返回        
  69.         }
  70. }

  71. /*******************************************************************************
  72. * 函數(shù)名  : System_Initialization
  73. * 描述    : STM32系統(tǒng)初始化函數(shù)(初始化STM32時(shí)鐘及外設(shè))
  74. * 輸入    : 無
  75. * 輸出    : 無
  76. * 返回    : 無
  77. * 說明    : 無
  78. *******************************************************************************/
  79. void System_Initialization(void)
  80. {
  81.         RCC_Configuration();                //設(shè)置系統(tǒng)時(shí)鐘為72MHZ(這個(gè)可以根據(jù)需要改)
  82.   SysTick_Init_Config();  //初始化系統(tǒng)滴答時(shí)鐘SysTick
  83.   NVIC_Configuration();                //STM32中斷向量表配配置
  84.         Timer2_Init_Config();                //定時(shí)器2初始化配置
  85.         USART1_Init_Config(115200);        //串口1初始化配置
  86.         USART2_Init_Config(115200);        //串口2初始化配置        
  87.         GPIO_Config();          //初始化GPIO
  88. }
  89. /*******************************************************************************
  90. * 函數(shù)名  : Ram_Initialization
  91. * 描述    : 變量初始化函數(shù)
  92. * 輸入    : 無
  93. * 輸出    : 無
  94. * 返回    : 無
  95. * 說明    : 無
  96. *******************************************************************************/
  97. void Ram_Initialization(void)
  98. {
  99.         Times=0;
  100.         shijian=0;
  101.         Timer0_start=0;
  102.         p1=Uart2_Buf;
  103.         p2=p1;
  104. }

  105. /*******************************************************************************
  106. * 函數(shù)名  : NVIC_Configuration
  107. * 描述    : STM32中斷向量表配配置
  108. * 輸入    : 無
  109. * 輸出    : 無
  110. * 返回值  : 無
  111. * 說明    : 設(shè)置KEY1(PC11)的中斷優(yōu)先組
  112. *******************************************************************************/
  113. void NVIC_Configuration(void)
  114. {
  115.         NVIC_InitTypeDef NVIC_InitStructure;                                                //定義NVIC初始化結(jié)構(gòu)體

  116.   /* Set the Vector Table base location at 0x08000000 */
  117.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  118.         
  119.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                    //設(shè)置中斷優(yōu)先級(jí)組為2,先占優(yōu)先級(jí)和從優(yōu)先級(jí)各兩位(可設(shè)0~3)
  120.         
  121.         /*定時(shí)器2中斷向量配置*/
  122.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                                    //設(shè)置中斷向量號(hào)
  123.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;        //設(shè)置搶先優(yōu)先級(jí)
  124.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                          //設(shè)置響應(yīng)優(yōu)先級(jí)
  125.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //使能NVIC
  126.         NVIC_Init(&NVIC_InitStructure);
  127.         /*串口1中斷向量配置*/
  128.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                  //設(shè)置中斷向量號(hào)
  129.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //設(shè)置搶先優(yōu)先級(jí)
  130.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                          //設(shè)置響應(yīng)優(yōu)先級(jí)
  131.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //使能NVIC
  132.         NVIC_Init(&NVIC_InitStructure);
  133.   /*串口2中斷向量配置*/
  134.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                  //設(shè)置中斷向量號(hào)
  135.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //設(shè)置搶先優(yōu)先級(jí)
  136.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                          //設(shè)置響應(yīng)優(yōu)先級(jí)
  137.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //使能NVIC
  138.         NVIC_Init(&NVIC_InitStructure);
  139. }
  140. /*******************************************************************************
  141. * 函數(shù)名  : USART2_IRQHandler
  142. * 描述    : 串口1中斷服務(wù)程序
  143. * 輸入    : 無
  144. * 返回    : 無
  145. * 說明    :
  146. *******************************************************************************/
  147. void USART2_IRQHandler(void)                        
  148. {
  149.                         u8 Res=0;
  150.       if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  151.                         {
  152.                         Res=USART_ReceiveData(USART2);
  153.                         *p1 = Res;            //將接收到的字符串存到緩存中
  154.                         p1++;                                        //緩存指針向后移動(dòng)
  155.                         if(p1>&Uart2_Buf[Buf2_Max])                       //如果緩存滿,將緩存指針指向緩存的首地址
  156.                         {
  157.                                 p1=Uart2_Buf;
  158.                         }
  159.                   }                        
  160. }         

  161. /*******************************************************************************
  162. * 函數(shù)名  : TIM2_IRQHandler
  163. * 描述    : 定時(shí)器2中斷斷服務(wù)函數(shù)
  164. * 輸入    : 無
  165. * 輸出    : 無
  166. * 返回    : 無
  167. * 說明    : 無
  168. *******************************************************************************/
  169. void TIM2_IRQHandler(void)   //TIM2中斷
  170. {
  171.         static u8 flag =1;

  172.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發(fā)生與否
  173.         {
  174.                
  175.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志
  176.                
  177.                 if(Timer0_start)
  178.                 Times++;
  179.                 if(Times > shijian)
  180.                 {
  181.                         Timer0_start = 0;
  182.                         Times = 0;
  183.                 }
  184.                
  185.                 if(flag)
  186.                 {
  187.                         LED4_ON();
  188.                         flag=0;
  189.                 }
  190.                 else
  191.                 {
  192.                         LED4_OFF();
  193.                         flag=1;
  194.                 }
  195.         }        
  196. }

  197. /*******************************************************************************
  198. * 函數(shù)名 : CLR_Buf2
  199. * 描述   : 清除串口2緩存數(shù)據(jù)
  200. * 輸入   :
  201. * 輸出   :
  202. * 返回   :
  203. * 注意   :
  204. *******************************************************************************/
  205. void CLR_Buf2(void)
  206. {
  207.         u16 k;
  208.         for(k=0;k<Buf2_Max;k++)      //將緩存內(nèi)容清零
  209.         {
  210.                 Uart2_Buf[k] = 0x00;
  211.         }
  212.   p1=Uart2_Buf;               //接收字符串的起始存儲(chǔ)位置
  213. }

  214. /*******************************************************************************
  215. * 函數(shù)名 : Find
  216. * 描述   : 判斷緩存中是否含有指定的字符串
  217. * 輸入   :
  218. * 輸出   :
  219. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  220. * 注意   :
  221. *******************************************************************************/

  222. u8 Find(char *a)
  223. {
  224.   if(strstr(Uart2_Buf,a)!=NULL)
  225.             return 1;
  226.         else
  227.                         return 0;
  228. }

  229. /*******************************************************************************
  230. * 函數(shù)名 : Second_AT_Command
  231. * 描述   : 發(fā)送AT指令函數(shù)
  232. * 輸入   : 發(fā)送數(shù)據(jù)的指針、發(fā)送等待時(shí)間(單位:S)
  233. * 輸出   :
  234. * 返回   :
  235. * 注意   :
  236. *******************************************************************************/

  237. void Second_AT_Command(char *b,char *a,u8 wait_time)         
  238. {
  239.         u8 i;
  240.         char *c;
  241.         c = b;                                                                                //保存字符串地址到c
  242.         CLR_Buf2();
  243.   i = 0;
  244.         while(i == 0)                    
  245.         {
  246.                 if(!Find(a))
  247.                 {
  248.                         if(Timer0_start == 0)
  249.                         {
  250.                                 b = c;                                                        //將字符串地址給b
  251.                                 for (; *b!='\0';b++)
  252.                                 {
  253.                                         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
  254.                                         USART_SendData(USART2,*b);//UART2_SendData(*b);
  255.                                 }
  256.                                 UART2_SendLR();        
  257.                                 Times = 0;
  258.                                 shijian = wait_time;
  259.                                 Timer0_start = 1;
  260.                    }
  261.     }
  262.            else
  263.                 {
  264.                         i = 1;
  265.                         Timer0_start = 0;
  266.                 }
  267.         }
  268.         CLR_Buf2();
  269. }

  270. /*******************************************************************************
  271. * 函數(shù)名 : Wait_CREG
  272. * 描述   : 等待模塊注冊(cè)成功
  273. * 輸入   :
  274. * 輸出   :
  275. * 返回   :
  276. * 注意   :
  277. *******************************************************************************/
  278. void Wait_CREG(void)
  279. {
  280.         u8 i;
  281.         u8 k;
  282.         i = 0;
  283.   while(i == 0)                                
  284.         {
  285.                 CLR_Buf2();        
  286.                 UART2_SendString("AT+CREG?");   //查詢等待模塊注冊(cè)成功
  287.                 UART2_SendLR();
  288.                 Delay_nMs(5000);                                                  
  289.             for(k=0;k<Buf2_Max;k++)                              
  290.             {
  291.                         if(Uart2_Buf[k] == ':')
  292.                         {
  293.                                 if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5'))   //說明注冊(cè)成功
  294.                                 {
  295.                                         i = 1;
  296.                                         UART1_SendLR();
  297.                                   break;
  298.                                 }
  299.                         }
  300.                 }
  301.                 UART1_SendString("注冊(cè)中.....");
  302.         }
  303. }

  304. /*******************************************************************************
  305. * 函數(shù)名 : Set_ATE0
  306. * 描述   : 取消回顯
  307. * 輸入   :
  308. * 輸出   :
  309. * 返回   :
  310. * 注意   :
  311. *******************************************************************************/
  312. void Set_ATE0(void)
  313. {
  314.         Second_AT_Command("ATE0","OK",3);                                                                //取消回顯               
  315. }
  316. /*******************************************************************************
  317. * 函數(shù)名 : Connect_Server
  318. * 描述   : GPRS連接服務(wù)器函數(shù)
  319. * 輸入   :
  320. ……………………

  321. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
SIM系列GSM模塊例程(STM32).7z (249.72 KB, 下載次數(shù): 745)



作者: 沈心齋    時(shí)間: 2018-5-24 10:06
學(xué)習(xí)一下,感謝分享
作者: djw000824    時(shí)間: 2018-5-29 16:07
好好學(xué)習(xí),天天向上!
作者: sfxcjq16527@cha    時(shí)間: 2018-5-31 10:35
看下行不行
作者: 家定不舉棋    時(shí)間: 2018-7-5 23:34
贊一個(gè)。。。!
作者: Dramalife    時(shí)間: 2018-7-14 12:01
謝謝樓主!
作者: guogongshao    時(shí)間: 2018-7-27 00:36
謝謝樓主
作者: qwthh    時(shí)間: 2018-7-29 16:53
樓主用的什莫板子啊
作者: Dramalife    時(shí)間: 2018-8-9 18:36
很好的資料
作者: qq767402837    時(shí)間: 2018-8-11 10:58
謝謝非常不錯(cuò)
作者: lzts88    時(shí)間: 2018-8-11 18:04
收藏備用,謝謝分享
作者: yinlingwei66    時(shí)間: 2018-8-30 14:26
樓主好人!
作者: yinlingwei66    時(shí)間: 2018-8-31 13:50
學(xué)習(xí)一下,感謝分享
作者: mapleleaf    時(shí)間: 2018-9-13 10:15
感謝分享,下載看看
作者: kailaohuyouk    時(shí)間: 2018-10-19 15:53
學(xué)習(xí)一下
作者: hawk717    時(shí)間: 2018-11-29 16:02
很好的資料,學(xué)習(xí)了
作者: 袁潔棟    時(shí)間: 2018-12-11 09:01
謝謝LZ分享,先下載
作者: fire11f    時(shí)間: 2019-1-15 10:18
我想看看,好程序,謝謝樓主
作者: wtfshq    時(shí)間: 2019-3-1 23:19

學(xué)習(xí)學(xué)習(xí),感謝分享
作者: motto6666    時(shí)間: 2019-3-5 14:52
謝謝樓主的分享
作者: shen1993    時(shí)間: 2019-3-5 16:36
謝謝樓主的分享
作者: shen1993    時(shí)間: 2019-3-5 16:37
我想看看,好程序,謝謝樓主
作者: 無亟待    時(shí)間: 2019-3-24 15:32
研究研究 謝謝大佬分享
作者: Hsq19900916    時(shí)間: 2019-3-27 09:19
sfxcjq16527@cha 發(fā)表于 2018-5-31 10:35
看下行不行

能下載嗎?
作者: Operaturn7    時(shí)間: 2019-4-7 00:26
難得的資料 需要下載了
作者: asdsx    時(shí)間: 2019-5-29 11:57
難得的資料 需要下載了
作者: 宗270    時(shí)間: 2019-5-30 14:22
學(xué)習(xí)學(xué)習(xí),謝謝樓主
作者: scott817    時(shí)間: 2019-7-2 20:14
正在學(xué)習(xí)STM32
作者: jopjob    時(shí)間: 2019-7-9 10:54
謝謝分享,目前這塊想搞下
作者: linouba    時(shí)間: 2019-7-19 10:47
謝謝樓主
作者: liuyongpc    時(shí)間: 2019-7-20 14:23
謝謝提供
作者: slim443    時(shí)間: 2019-7-20 15:25
謝謝版主
作者: Jasming    時(shí)間: 2019-8-5 21:15
下來研究下,謝謝分享!
作者: DWF18046665737    時(shí)間: 2019-8-28 09:50
樓主能分享一下硬件電路嗎?
作者: limimi    時(shí)間: 2019-8-28 13:26
很有用,感謝!
作者: zrm0806    時(shí)間: 2019-10-17 11:03
謝謝樓主

作者: 涵之派大星    時(shí)間: 2019-11-25 09:41
學(xué)習(xí)一下,感謝分享
作者: Lonlykey    時(shí)間: 2020-3-13 09:59
萬分感謝
作者: xwyk1    時(shí)間: 2020-3-18 11:41
萬分感謝
作者: 黃黃工    時(shí)間: 2020-4-21 12:32
謝謝分享。這個(gè)例程很有用。
作者: 就想學(xué)好單片機(jī)    時(shí)間: 2020-4-25 12:24
感謝樓主分享,最近正好需要
作者: 曾翁    時(shí)間: 2020-5-4 14:56
感謝樓主,學(xué)習(xí)了,謝謝!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1