本程序通過手機短信控制LED的亮滅
使用單片機串口2與模塊通信;接法如下
STM32 GPRS模塊
PA3 (RXD2)->RXD
PA2 (TXD2)->TXD
GND ->GND
1、板子上電后運行指示燈RUNING_LED會以一秒的頻率閃爍;
2、通過芯片的串口1可以監視模塊的登錄情況;
3、手機發送“onled”點亮LED;
4、手機發送“offled”熄滅LED;
5、使用串口2與模塊通信,串口1用于將信息打印輸出。
單片機源程序如下:
- /**********************************************************************************
- * 工程名 :
- * 描述 :通過手機發送短信控制LED
- * 實驗平臺:STM32F10X
- * 庫版本 :
- **********************************************************************************/
- #include "stm32f10x.h"
- #include "usart.h"
- #include "Led.h"
- #include "SysTick.h"
- #include "timer.h"
- #include "string.h"
- #define Automatic_Startup 1 //定義自啟動 V1.2版本起有自啟動功能
- //#define Buf1_Max 60 //串口1緩存長度
- #define Buf2_Max 200 //串口2緩存長度
- /************* 本地常量聲明 **************/
- /************* 本地變量聲明 **************/
- //char Uart1_Buf[Buf1_Max];
- char Uart2_Buf[Buf2_Max];
- u8 Times=0,First_Int = 0,shijian=0;
- vu8 Timer0_start; //定時器0延時啟動計數器
- vu8 Uart2_Start; //串口2開始接收數據
- vu8 Uart2_End; //串口2接收數據結束
- /************* 本地函數聲明 **************/
- void CLR_Buf2(void);
- u8 Find(char *a);
- void Second_AT_Command(char *b,u8 wait_time);
- void Set_Text_Mode(void);
- void Check_New_Message(void);
- void Wait_CREG(void);
- /************* 外部函數和變量聲明*****************/
- /*******************************************************************************
- * 函數名 : main
- * 描述 : 主函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 : 串口2負責與GPRS模塊通信,串口1用于串口調試,可以避免在下載程序時數據
- 還發送到模塊
- *******************************************************************************/
- int main(void)
- {
- SysTick_Init_Config();
- GPIO_Config();
-
- USART1_Init_Config(115200);
- USART2_Init_Config(115200);
- Timer2_Init_Config();
- UART1_SendString("GPRS模塊短信測試程序\r\n");
- UART1_SendString("GPRS模塊在注冊網絡\r\n");
- Wait_CREG();
- UART1_SendString("GPRS模塊注冊成功\r\n");
- UART1_SendString("GPRS模塊短信模式設置\r\n");
- Set_Text_Mode();
- UART1_SendString("設置成功,短信模式:TEXT\r\n");
- //Second_AT_Command("AT+CMGD=1,4",3);//刪除卡上所有短信
-
- UART1_SendString("初始化完成\r\n");
- while(1)
- {
- Check_New_Message();
- }
- }
- /*******************************************************************************
- * 函數名 : USART2_IRQHandler
- * 描述 : 串口1中斷服務程序
- * 輸入 : 無
- * 返回 : 無
- * 說明 :
- *******************************************************************************/
- void USART2_IRQHandler(void)
- {
- u8 Res=0;
- Res =USART_ReceiveData(USART2);
- Uart2_Buf[First_Int] = Res; //將接收到的字符串存到緩存中
- First_Int++; //緩存指針向后移動
- if(First_Int > Buf2_Max) //如果緩存滿,將緩存指針指向緩存的首地址
- {
- First_Int = 0;
- }
- }
- /*******************************************************************************
- * 函數名 : TIM2_IRQHandler
- * 描述 : 定時器2中斷斷服務函數
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 無
- * 說明 : 無
- *******************************************************************************/
- void TIM2_IRQHandler(void) //TIM3中斷
- {
- static u8 flag =1;
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發生與否
- {
-
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中斷標志
-
- if(Timer0_start)
- Times++;
- if(Times > shijian)
- {
- Timer0_start = 0;
- Times = 0;
- }
-
- if(flag)
- {
- LED4_ON();
- flag=0;
- }
- else
- {
- LED4_OFF();
- flag=1;
- }
- }
- }
- /*******************************************************************************
- * 函數名 : CLR_Buf2
- * 描述 : 清除串口2緩存數據
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf2(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //將緩存內容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲位置
- }
- /*******************************************************************************
- * 函數名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(char *a)
- {
- if(strstr(Uart2_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函數名 : Second_AT_Command
- * 描述 : 發送AT指令函數
- * 輸入 : 發送數據的指針、發送等待時間(單位:S)
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(char *b,u8 wait_time)
- {
- u8 i;
- char *c;
- c = b; //保存字符串地址到c
- CLR_Buf2();
- i = 0;
- while(i == 0)
- {
- if(!Find("OK"))
- {
- if(Timer0_start == 0)
- {
- b = c; //將字符串地址給b
- for (; *b!='\0';b++)
- {
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- USART_SendData(USART2,*b);//UART2_SendData(*b);
- }
- UART2_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函數名 : Set_Text_Mode
- * 描述 : 設置短信為TEXT文本模式
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_Text_Mode(void)
- {
- Second_AT_Command("ATE0",3); //取消回顯
- Second_AT_Command("AT+CNMI=3,2,0,0,0",3); //新短信直接輸出
- Second_AT_Command("AT+CMGF=1",3); //TEXT模式
- Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"",3); //所有操作都在SIM卡中進行
- }
- /*******************************************************************************
- * 函數名 : Check_Message_rec
- * 描述 : 檢查是否有新信息,并執行信息內容指令
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Check_New_Message(void)
- {
- if(strstr(Uart2_Buf,"+CMT")!=NULL) //若緩存字符串中含有"+CMT"就表示有新的短信
- {
- Delay_nMs(50);//等待數據全部接收完成
- UART1_SendString("收到新短信:\r\n");
- UART1_SendString(Uart2_Buf); //把模塊返回的信息原樣輸出
- if(strstr(Uart2_Buf,"onled")!=NULL)
- {
- LED1_ON();
- }
- if(strstr(Uart2_Buf,"offled")!=NULL)
- {
- LED1_OFF();
- }
- CLR_Buf2();
- //Second_AT_Command("AT+CMGD=1,4",3);//刪除短信
- }
- }
- /*******************************************************************************
- * 函數名 : Wait_CREG
- * 描述 : 等待模塊注冊成功
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
SIM系列GSM模塊例程(STM32).7z
(268.96 KB, 下載次數: 66)
2018-12-20 22:19 上傳
點擊文件名下載附件
|