初级会员
- 积分
- 51
- 金钱
- 51
- 注册时间
- 2017-1-12
- 在线时间
- 9 小时
|
楼主 |
发表于 2017-2-3 15:29:57
|
显示全部楼层
#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="0011000D91685188299405F40008AA0A679C4E9179D16280000A";//发送短信内容
/************************短信内容解析**************************************/
/*
//短信中心号(倒序) 目标手机(倒序) 短信内容(测试已经完成)
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延时启动计数器
/************* 本地函数声明 **************/
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);//设置短信模式PDU
void Send_Pdu_Sms(void);//发送一条中文短信
/************* 外部函数和变量声明*****************/
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口2负责与MG323模块通信,串口1用于串口调试,可以避免在下载程序时数据
还发送到模块
*******************************************************************************/
int main(void)
{
SysTick_Init_Config();
GPIO_Config();
USART2_Init_Config(115200);
Timer2_Init_Config();
Wait_CREG(); //查询等待模块注册成功
Set_Pdu_Mode();//设置短信为PDU模式
Send_Pdu_Sms();//发送一条短消息
while(1)
{
;
}
}
/*******************************************************************************
* 函数名 : 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,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();
}
/*******************************************************************************
* 函数名 : Set_Pdu_Mode
* 描述 : 设置短信为PDU文本模式
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Set_Pdu_Mode(void)
{
Second_AT_Command("ATE0","OK",3); //取消回显
Second_AT_Command("AT+CMGF=0","OK",3); //设置PDU模式
}
/*******************************************************************************
* 函数名 : Send_Pdu_Sms
* 描述 : 发送PDU文本短信
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Send_Pdu_Sms(void)
{
Second_AT_Command("AT+CMGS=25",">",3); //发送数据长度:25(具体的计算方法看串口调试比较)接收到“>”才发送短信内容
UART2_SendString(content); //发送短信内容
USART_SendData(USART2 ,0X1A); //发送结束符
UART2_SendLR();
}
/*******************************************************************************
* 函数名 : 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+5] != '3'))||(Uart2_Buf[k+4] == '5')) //说明模块已经注册成功
{
i = 1;
break;
}
}
}
}
}
|
|