51
单片机和sim900a模块连接,
为什么一直AT握手指令成功不了????????????????
求大神帮忙
/************************主函数**************************/
void main()
{
//int j;
IGT=0;
DelayMs(1000); //延时1s
IGT=1;
Serial_Init(); //调用串口初始化函数 gsm用
//
ti = 1;
CLR_Buf(); //清除缓存内容
DelayMs(300); //延时1F 给GSM找网时间,必须注意
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令 //每次默认开回显ATE1
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(60000); //延时
}
CLR_Buf(); //清除缓存内容
//LED1 = 0; //点亮握手成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CSCS="GSM"");//GSM网络
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
DelayMs(delay_time); //延时
Send_ASCII("AT+CPMS="SM","SM","SM"");//所有操作都在MT(模块终端)中进行
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
//LED2 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGF=0");//设置PDU模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
//LED3 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGDA=6");//删除所有短信
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGF=1");//设置文本模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGDA="DEL ALL"");//删除所有短信
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
// LED3 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
// LED3 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
// LED4 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGD=1"); //删除第一条信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
//LED5 = 0; //点亮设置成功指示灯
DelayMs(delay_time); //延时
Send_ASCII("AT"); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
//LED1 = 1;
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGF=0"); //发送PDU指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
// LED2 = 1;
DelayMs(delay_time); //延时
Send_ASCII("AT+CSCS="GSM""); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
// LED3 = 1;
DelayMs(delay_time); //延时
Send_ASCII("AT+CMGS=29"); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功 DelayMs(delay_time); //延时
// LED4 = 1;
Send_ASCII("0011000D91688107293201F70008A00E8B66544AFF1A5BA46E298FC79AD8"); //发送读取信息指令18710881316F 8117801813F6
Send_Hex(0x1a);
Send_Hex(0x0d); //发送回车符 13659212213F 3156292112F3
Send_Hex(0x0a); //发送换行符
DelayMs(delay_time); //延时
while(!Hand("OK")); //等待设置成功
DelayMs(20000); //报警时长**************************************************************
}
void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;
TR1 = 1; //开启定时器1 TCON中的控制字
ES = 1; //开启串口中断
EA = 1; //开启全局中断
}
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
for (b; *b!=' ';b++)
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
}
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //将缓存内容清零
{
Rec_Buf[k] = 0;
}
i = 0; //接收字符串的起始存储位置
}
void Send_Hex(unsigned char c)
{
ES = 0; //关串口中断
SBUF = c;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
ES = 1; //开串口中断
}
bit Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
void Serial_Int() interrupt 4
{
ES = 0; //关串口中断,防止中断嵌套
if(TI) //如果是发送中断,则不做任何处理
{
TI = 0; //清除发送中断标志位
}
if(RI) //如果是接送中断,则进行处理
{
RI = 0; //清除接收中断标志位
Rec_Buf
= SBUF; //将接收到的字符串存到缓存中
i++; //缓存指针向后移动
if(i>200) //如果缓存满,将缓存指针指向缓存的首地址
{
i = 0;
}
}
ES = 1; //开启串口中断
}
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令 //每次默认开回显ATE1
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
DelayMs(60000); //延时
}
=》while(!Hand("OK"))
{
Send_ASCII("AT ");
DelayMs(1000);
}
for (b; *b!=' ';b++)
{
SBUF = *b;
while(TI!=1);
TI = 0; }
改为:while(b != ' ')
{
SBUF=*b++;
while(!TI)
{
TI=0;
}
}
一周热门 更多>