|
各位大佬幫忙看看這個(gè)程序哪里有問題,我用串口調(diào)試助手可以發(fā)出消息,但是用了這個(gè)程序就收不到消息。
#include "config.h"
#include "string.h"
#include "delay.h"
#include "uart.h"
#define Buf1_Max 200 //串口2緩存長度
/************* 本地常量聲明 **************/
sbit RUNING_LED = P3^2; //運(yùn)行指示燈
static unsigned char *content="0891683110401305F00011000D91689158222612F60008AA0C80014EBA672A670D836F";//發(fā)送短信內(nèi)容
/************************短信內(nèi)容解析**************************************/
/*08913181022026F90011000D919158222612F60008AA0C80014EBA672A670D836F
//短信中心號(hào)(倒序) 目標(biāo)手機(jī)(倒序) 短信內(nèi)容(測(cè)試已經(jīng)完成)
8613800756500F 8613798985989F
0891 683108706505F0 11000D91 683197985889F9 0008AA0C 6D4B8BD55DF27ECF5B8C6210
0891 683110401305F0 11000D91 689158222612F6 0008AA0C 80014EBA672A670D836F
*/
/************* 本地變量聲明 **************/
xdata u8 Uart1_Buf[Buf1_Max];
u8 Times=0,First_Int = 0,shijian=0;
bdata u8 Flag;//定時(shí)器標(biāo)志位
sbit Timer0_start =Flag^0; //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器
/************* 本地函數(shù)聲明 **************/
void GPIO_config(void); //端口初始化配置
void Timer0Init(void); //定時(shí)器0初始化
void CLR_Buf1(void); //清除串口2接收緩存
u8 Find(u8 *a); //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time); //發(fā)送AT指令函數(shù)
void Set_Pdu_Mode(void);//設(shè)置短信模式PDU
void Wait_CREG(void); //查詢等待模塊注冊(cè)成功
void Send_Pdu_Sms(void);//發(fā)送一條中文短信
/************* 外部函數(shù)和變量聲明*****************/
/*******************************************************************************
* 函數(shù)名 : main
* 描述 : 主函數(shù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 : 串口波特率是9600,GPRS模塊默認(rèn)波特率是115200,需要自己通過串口助手修改
為9600方可使用。
*******************************************************************************/
void main(void)
{
Timer0Init(); //初始化定時(shí)器0
GPIO_config();
EA=1; //開總中斷
Uart1Init(); //初始化串口9600
Wait_CREG(); //查詢等待模塊注冊(cè)成功
Set_Pdu_Mode();//設(shè)置短信為PDU模式
Send_Pdu_Sms();//發(fā)送一條短消息
while(1)
{
;
}
}
/*******************************************************************************
* 函數(shù)名 : Uart1
* 描述 : 串口1中斷服務(wù)入口函數(shù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Uart1() interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
Uart1_Buf[First_Int] = SBUF; //將接收到的字符串存到緩存中
First_Int++; //緩存指針向后移動(dòng)
if(First_Int > Buf1_Max) //如果緩存滿,將緩存指針指向緩存的首地址
{
First_Int = 0;
}
}
if (TI)
{
TI = 0; //清除TI位
}
}
/*******************************************************************************
* 函數(shù)名 : Timer0_ISR
* 描述 : 定時(shí)器0中斷服務(wù)入口函數(shù),20ms中斷一次
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
static u8 Time_count=0;
TL0 = 0x00; //重置定時(shí)器初值
TH0 = 0xB8; //重置定時(shí)器初值
TR0=0;//關(guān)定時(shí)器
Time_count++;
if(Time_count>=50)
{
Time_count = 0;
RUNING_LED =~RUNING_LED;
}
if(count_20ms) //20ms延時(shí)計(jì)數(shù)器
count_20ms--;
if(Timer0_start)
Times++;
if(Times > (50*shijian))
{
Timer0_start = 0;
Times = 0;
}
TR0=1;//開定時(shí)器
}
/*******************************************************************************
* 函數(shù)名 : GPIO_config
* 描述 : IO口配置函數(shù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void GPIO_config(void)
{
RUNING_LED=0;
}
/*******************************************************************************
* 函數(shù)名 : Timer0Init
* 描述 : 定時(shí)器0初始化,20ms定時(shí)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Timer0Init(void) //20毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //
TMOD |= 0x01; //設(shè)置定時(shí)器模式,16位定時(shí)器
TL0 = 0x00; //設(shè)置定時(shí)器初值
TH0 = 0xB8; //設(shè)置定時(shí)器初值
TF0 = 0; //清TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //使能定時(shí)器0中斷
}
/*******************************************************************************
* 函數(shù)名 : CLR_Buf1
* 描述 : 清除串口2緩存數(shù)據(jù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf1(void)
{
u16 k;
for(k=0;k<Buf1_Max;k++) //將緩存內(nèi)容清零
{
Uart1_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存儲(chǔ)位置
}
/*******************************************************************************
* 函數(shù)名 : Find
* 描述 : 判斷緩存中是否含有指定的字符串
* 輸入 :
* 輸出 :
* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意 :
*******************************************************************************/
u8 Find(u8 *a)
{
if(strstr(Uart1_Buf,a)!=NULL)
return 1;
else
return 0;
}
/*******************************************************************************
* 函數(shù)名 : Second_AT_Command
* 描述 : 發(fā)送AT指令函數(shù)
* 輸入 : 發(fā)送數(shù)據(jù)的指針、發(fā)送等待時(shí)間(單位:S)
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
{
u8 i;
u8 *c;
c = b; //保存字符串地址到c
CLR_Buf1();
i = 0;
while(i == 0)
{
if(!Find(a)) //查找需要應(yīng)答的字符
{
if(Timer0_start == 0)//超時(shí)重新發(fā)送命令
{
b = c; //將字符串地址給b
for (b; *b!='\0';b++)
{
UART1_SendData(*b);
}
UART1_SendLR();
Times = 0;
shijian = wait_time;
Timer0_start = 1; //開始計(jì)時(shí)
}
}
else
{
i = 1;
Timer0_start = 0;
}
}
CLR_Buf1();
}
/*******************************************************************************
* 函數(shù)名 : Set_Pdu_Mode
* 描述 : 設(shè)置短信為TEXT文本模式
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
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卡中進(jìn)行
}
/*******************************************************************************
* 函數(shù)名 : Send_Pdu_Sms
* 描述 : 發(fā)送PDU文本短信
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Send_Pdu_Sms(void)
{
Second_AT_Command("AT+CMGS=25",">",3); //發(fā)送數(shù)據(jù)長度:27(具體的計(jì)算方法看串口調(diào)試比較)接收到“>”才發(fā)送短信內(nèi)容
UART1_SendString(content); //發(fā)送短信內(nèi)容
UART1_SendData(0X1A); //發(fā)送結(jié)束符
}
/*******************************************************************************
* 函數(shù)名 : Wait_CREG
* 描述 : 等待模塊注冊(cè)成功
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Wait_CREG(void)
{
u8 i;
u8 k;
i = 0;
CLR_Buf1();
while(i == 0)
{
CLR_Buf1();
UART1_SendString("AT+CREG?");//查詢模塊網(wǎng)絡(luò)注冊(cè)狀態(tài)
UART1_SendLR();
delay_ms(250);
for(k=0;k<Buf1_Max;k++)
{
if(Uart1_Buf[k] == ':')
{
if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明網(wǎng)絡(luò)注冊(cè)成功
{
i = 1;
break;
}
}
}
}
}
|
|