用串口调试助手测试TC35,收发都正常。
但是用51
单片机发送AT指令给TC35后,TC35,51收不到任何信息,无法进入中断。
程序应该没有问题,硬件上也没有问题,但就是收发布成功,代码见附件。
急求啊!!!! qq 77323436
部分代码
TC35部分:
#include "common.h"
char RxBuf[RxBuf_N]={0}; //定义串口接收数据缓冲区
uchar RxPoint; //Rx缓冲区指针
bit flag=0; //用来等待发送信息结束后,接收TC35响应的标志
uchar PhoneNum[15]="+8613477144122"; //
手机号码
const uchar *MsContent="Atten
tion Please!"; //短信内容
sbit IGT=P1^1;
//查找字符串,在s中查找t
//返 回 值: s_temp(t在s中的位置)成功 0失败
char *LookFor_Str(uchar *s, uchar *t)
{
uchar *s_temp;
uchar *m_temp;
uchar *t_temp;
if (s == 0 ||t == 0) return 0;
for (s_temp = s; *s_temp != ' '; s_temp++)
{
m_temp = s_temp;
for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
if (*t_temp == ' ') return s_temp;
}
return 0;
}
void start_tc35()
{
IGT=0;
delay_ms(150);
IGT=1;
delay_ms(250);
IGT=0;
delay_ms(150);
IGT=1;
delay_ms(150);
}
/*
void start_tc35()
{
IGT=0;
delay_ms(1000);
IGT=1;
delay_ms(1000);
} */
//发送"AT"联机指令,测试是否连接正确
void Send_AT(void)
{
uchar *p;
uchar i=10;
while(i--) //测试10次,在某一次成功就退出
{
RxPoint=0; //buffer指针清0
SendString("AT
"); //发送AT回车
Put_Str(3,0,"sending over");
ES=1; //必须中断 串口中断应许 等待应答"OK"
delay_ms(100); //等待接受数据完成
while(flag==0);
flag=0;
delay_ms(300);
p=LookFor_Str(RxBuf,"OK"); //接收到的数据存在RsBuf
if(p!=0) //接收到"OK"
{
PutStr(1,0,"GSM ready");
delay_ms(1000);
break;
}
PutStr(1,0,"GSM error");
delay_ms(500);
}
}
//设置短信模式 1:text模式 0:PDU模式
//串口发送数组命令到TC35,AT+CMGF=1
void Set_Mode(uchar mode)
{
uchar *p,i=10;
while(i--) //测试10次,在某一次成功就退出
{
RxPoint=0; //buffer指针清0
if(mode) SendString("AT+CMGF=1
"); //设置短消息模式 1 TEXT
else SendString("AT+CMGF=0
"); //设置短消息模式 0 PDU模式
ES=1; //必须中断 串口中断应许 等待应答"OK"
delay_ms(300); //等待接受数据完成
while(flag==0);
flag=0;
delay_ms(300);
p=LookFor_Str(RxBuf,"OK"); //接收到的数据存在RsBuf
if(p!=0) //接收到"OK"
{
PutStr(1,0,"短信模式:text");
delay_ms(1000);
break;
}
PutStr(1,0,"短信模式设置失败");
delay_ms(500);
}
}
//发送号码
void Send_PhoneNum(uchar *str)
{
uchar i=0;
while(*str)
{
SendASC(*str) ;
str++;
i++;
if(i==14) break; //只发送14个
}
}
//发送TEXT短信 AT+CMGS="+8613477144122"
//*dialnum 目的号码 *text短信内容
//返回:1 发送成功 0 发送失败
uchar TransmitText(uchar *dialnum,uchar *text)
{
uchar i=10,j=10;
uchar *p;
while(i--)
{
RxPoint=0; //buffer指针清0
SendString("AT+CMGS="); //信息发送指令 AT+CMGS="+8613477144122"
SendASC('"');
Send_PhoneNum(dialnum); //号码
SendASC('"');
SendASC('
'); //回车
while(flag==0);
flag=0;
delay_ms(300);
p=LookFor_Str(RxBuf,">"); //">"
if(p!=0) //如果接受到 > 发送text
{
RxPoint=0; //清空接收缓冲区
SendString(text); //发送短信内容
SendString("x1a
"); //'x1a'结束符(相当CTRL+Z) '
'回车符
while(flag==0);
flag=0;
delay_ms(5000); //这里要延时足够长时间,否则会读取错误
p=LookFor_Str(RxBuf,"OK"); //查找OK
if(p!=0) //发送成功
{
PutStr(2,0,"To: ");
PutStr(2,2,dialnum+3);
PutStr(3,0,"发送成功 ^_^");
return 1;
}
else
{
PutStr(2,0,"发送失败");
delay_ms(1000);
PutStr(2,0,"正在重发");
}
}
}
PutStr(2,0,"多次重发失败");
return 0;
}
//完整的短信发送函数
//dialnum:手机号码 text:短信内容
void Send_Message(uchar *dialnum,uchar *text)
{
Send_AT(); //发送AT
Set_Mode(1); //设置短信模式:text
TransmitText(dialnum,text); //设置
}
通讯部分代码:
#ifndef _USART_INCLUDED_
#define _USART_INCLUDED_
#include "common.h"
//延时函数ms(condition:11.0592M HSE)
uchar RxIn=0;//串口入口
void delay_ms(unsigned int time)
{
unsigned char tres;
for(;time>0;time--)
{
tres=150;
while(tres--);
}
}
void USART_Init()
{
//ES=0;
SCON=0x50; //UART方式1:8位UART; :允许接收
PCON=0x00; //SMOD=0:波特率不加倍
TMOD=0x20; //T1方式2,用于UART波特率
TH1=0xFD;
TL1=0xFD; //UART波特率设置:9600
TR1=1;
//ES=1;
EA=1;
}
/*void SendASC(uchar dat)
{
TI=0;
ES=0;
if(dat=='
'){ES=1;} //收到回车 开ES
SBUF=dat;
while(TI==0);{TI=0;}
}*/
void SendASC(uchar d)
{
SBUF=d;
while(!TI);
TI=0;
}
void SendString(uchar *str)
{
//TI=0;
while(*str)
{
SendASC(*str) ;
str++;
// delay_ms(100);
}
}
// 通讯中断接收程序 中断函数无返回值
void USART_Interrupt(void) interrupt 4 //放在这里 和放在main()里面是一样的
{
EA=0;
if(RI)
flag=1;
if(TI)
Put_Str(4,0,"interrupt in");
{
Put_Str(3,0," RI interrupt");
//delay_ms(1000);
RI=0;
if(RxPoint<RxBuf_N)
{
RxBuf[RxPoint++]=SBUF; //write
}
RI=0;
}
EA=1;
}
#endif
-
-
程序部分[new].rar
下载积分: 积分 -1 分
52.41 KB, 下载次数: 77, 下载积分: 积分 -1 分
一周热门 更多>