|
sim800c用pdu方式發(fā)送短信,很簡單,下面是例程
單片機源程序如下:
- /**********************************************************************************
- * 工程名 :發(fā)送中文短信
- * 描述 :通過STM32開發(fā)板控制模塊發(fā)送中文短信
- * 實驗平臺:STM32F10X
- * 庫版本 :
- * 硬件連接說明
- 使用單片串口2與GPRS模塊通信 注:使用串口2可以避免下載和通信不會沖突
- STM32 GPRS模塊
- PA3 (RXD2)->RXD
- PA2 (TXD2)->TXD
- GND ->GND
- * 軟件功能說明
- 板子上電后運行指示燈RUNING_LED會以一秒的頻率閃爍
- 修改短信中心號、接收方手機號和短信內(nèi)容,編譯成功后下載到單片機里面,就可以實現(xiàn)
- 發(fā)送一條中文短信,中文短信具體的解析可以參考串口調(diào)試筆記
- **********************************************************************************/
- #include "stm32f10x.h"
- #include "usart.h"
- #include "Led.h"
- #include "SysTick.h"
- #include "timer.h"
- #include "string.h"
- #define Buf2_Max 200 //串口2緩存長度
- /************* 本地常量聲明 **************/
- static char *content="0891683108706505F011000D91683197985889F90008AA0C6D4B8BD55DF27ECF5B8C6210";//發(fā)送短信內(nèi)容
- /************************短信內(nèi)容解析**************************************/
- /*
- //短信中心號(倒序) 目標(biāo)手機(倒序) 短信內(nèi)容(測試已經(jīng)完成)
- 8613800756500F 8613798985989F
- 0891 683108706505F0 11000D91 683197985889F9 0008AA0C 6D4B8BD55DF27ECF5B8C6210
- */
- /************* 本地變量聲明 *********************************************/
- char Uart2_Buf[Buf2_Max]; //串口2接收緩存
- u8 Times=0,First_Int = 0,shijian=0;
- vu8 Timer0_start; //定時器0延時啟動計數(shù)器
- /************* 本地函數(shù)聲明 **************/
- void CLR_Buf2(void);
- u8 Find(char *a);
- void Second_AT_Command(char *b,char *a,u8 wait_time);
- void Wait_CREG(void);
- void Set_Pdu_Mode(void);//設(shè)置短信模式PDU
- void Send_Pdu_Sms(void);//發(fā)送一條中文短信
- /************* 外部函數(shù)和變量聲明*****************/
- /*******************************************************************************
- * 函數(shù)名 : main
- * 描述 : 主函數(shù)
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 : 串口2負(fù)責(zé)與MG323模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時數(shù)據(jù)
- 還發(fā)送到模塊
- *******************************************************************************/
- int main(void)
- {
- SysTick_Init_Config();
- GPIO_Config();
-
- USART2_Init_Config(115200);
- Timer2_Init_Config();
- Wait_CREG(); //查詢等待模塊注冊成功
- Set_Pdu_Mode();//設(shè)置短信為PDU模式
- Send_Pdu_Sms();//發(fā)送一條短消息
- while(1)
- {
- ;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : USART2_IRQHandler
- * 描述 : 串口1中斷服務(wù)程序
- * 輸入 : 無
- * 返回 : 無
- * 說明 :
- *******************************************************************************/
- 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;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : TIM2_IRQHandler
- * 描述 : 定時器2中斷斷服務(wù)函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 無
- * 說明 : 無
- *******************************************************************************/
- void TIM2_IRQHandler(void) //TIM3中斷
- {
- static u8 flag =1;
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
- {
-
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中斷標(biāo)志
-
- if(Timer0_start)
- Times++;
- if(Times > shijian)
- {
- Timer0_start = 0;
- Times = 0;
- }
-
- if(flag)
- {
- LED4_ON();
- flag=0;
- }
- else
- {
- LED4_OFF();
- flag=1;
- }
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : CLR_Buf2
- * 描述 : 清除串口2緩存數(shù)據(jù)
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf2(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //將緩存內(nèi)容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲位置
- }
- /*******************************************************************************
- * 函數(shù)名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(char *a)
- {
- if(strstr(Uart2_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函數(shù)名 : Second_AT_Command
- * 描述 : 發(fā)送AT指令函數(shù)
- * 輸入 : 發(fā)送數(shù)據(jù)的指針、希望接收到的應(yīng)答、發(fā)送等待時間(單位:S)
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(char *b,char *a,u8 wait_time)
- {
- u8 i;
- char *c;
- c = b; //保存字符串地址到c
- CLR_Buf2();
- i = 0;
- while(i == 0)
- {
- if(!Find(a))
- {
- if(Timer0_start == 0)
- {
- b = c; //將字符串地址給b
- for (; *b!='\0';b++)
- {
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- USART_SendData(USART2,*b);
- }
- UART2_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函數(shù)名 : Set_Pdu_Mode
- * 描述 : 設(shè)置短信為PDU文本模式
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_Pdu_Mode(void)
- {
- Second_AT_Command("ATE0","OK",3); //取消回顯
- Second_AT_Command("AT+CMGF=0","OK",3); //設(shè)置PDU模式
- Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中進行
- }
- /*******************************************************************************
- * 函數(shù)名 : Send_Pdu_Sms
- * 描述 : 發(fā)送PDU文本短信
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Send_Pdu_Sms(void)
- {
- Second_AT_Command("AT+CMGS=27",">",3); //發(fā)送數(shù)據(jù)長度:27(具體的計算方法看串口調(diào)試比較)接收到“>”才發(fā)送短信內(nèi)容
- UART2_SendString(content); //發(fā)送短信內(nèi)容
- USART_SendData(USART2 ,0X1A); //發(fā)送結(jié)束符
- UART2_SendLR();
- }
- /*******************************************************************************
- * 函數(shù)名 : Wait_CREG
- * 描述 : 等待模塊注冊成功
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf2();
- while(i == 0)
- {
- CLR_Buf2();
- UART2_SendString("AT+CREG?"); //查找模塊是否注冊成功
- UART2_SendLR();
- Delay_nMs(5000);
- for(k=0;k<Buf2_Max;k++)
- {
- if(Uart2_Buf[k] == ':')
- {
- if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //說明模塊已經(jīng)注冊成功
- {
- i = 1;
- break;
- }
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
4.發(fā)送中文短信.7z
(187.88 KB, 下載次數(shù): 252)
2019-1-28 01:47 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|