返回信息流STC89C52单片机,TC35模块,串口连接,想通过单片机控制TC35发送text短信,程序如下,现在用串口调试工具可以收到AT,AT+CMGF等指令,但是连到模块后无法发送短信,个人感觉似乎用于接收TC35回馈信息的数组无法清空,请求各位大牛指导。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define RxBuf_N 25
char RxBuf[RxBuf_N]=0x00; //定义串口接收数据缓冲区
uchar RxPoint; //Rx缓冲区指针
bit flag = 0; //用来等待发送信息后接收TC35响应的标志
uchar PhoneNum[11]={'1','3','7','1','8','3','9','1','9','8','4'};
const uchar *MsContent = "Hello!\r";
void delay_ms(uint time)
{
uchar tres;
for(;time>0;time--)
{
tres = 150;
while(tres--);
}
}
void USART_Init() //串口初始化
{
SCON = 0x50; //串口:方式1,接收允许
PCON = 0x00;
TMOD = 0x20; //定时器1:模式2,8位自动重装,用于产生波特率
TH1 = 0xfd; //初值设定9600bit
TL1 = 0xfd;
TR1 = 1; //开启定时器1
EA = 1;
//ES = 1;
}
void SendASC(uchar d) //发送ASCII码
{
SBUF = d;
while(!TI);
TI = 0;
}
void SendString(uchar *str) //发送字符串
{
while(*str)
{
SendASC(*str);
str++;
}
}
//查找字符串,在s中找到t
//返回值:s_temp(t在s中的位置)成功0,失败1
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!='\0';s_temp++)
{
m_temp = s_temp;
for(t_temp = t;*t_temp == *m_temp;t_temp++,m_temp++);
if(*t_temp =='\0')
{
return s_temp;
}
}
return 0;
}
//发送“AT”联机指令,测试是否连接正确
void Send_AT()
{
uchar *p;
uchar i = 10;
while(i--) //重复10次,有一次联机成功,则退出
{
RxPoint = 0;
SendString("AT\r"); //发送AT回车
ES =1; //串口中断允许,等待应答OK
while(flag == 0);
flag = 0;
delay_ms(300);
p = LookFor_Str(RxBuf,"OK"); //接收到的数据存储在RxBuf
if(p!=0)
{
//PutStr(0,0,"GSM模块正常");
P1 = 0;
delay_ms(100);
P1 = 1;
break;
}
delay_ms(1000);
}
}
//设置短信模式:1为text模式,0为PDU模式
//串口发送数组命令到TC35,AT+CMGF =1
void Set_Mode(uchar mode)
{
uchar *p,i = 10;
RxPoint = 0;
while(i--) //测试10次,某一次成功就退出
{
RxPoint = 0; //buffer指针清零
if(mode)
SendString("AT+CMGF=1\r"); //设置短信格式为text模式
else
SendString("AT+CMGF=0\r"); //PDU
ES = 1; //串口中断,等待应答
while(flag==0);
flag = 0;
delay_ms(300);
p = LookFor_Str(RxBuf,"OK"); //接受到OK否?
if(p!=0)
{
//PutStr(1,0,"短信模式:text");
P1 = 1;
delay_ms(100);
P1 = 0;
break;
}
delay_ms(1000);
}
}
//发送号码
void Send_PhoneNum(uchar *str)
{
uchar i = 0;
while(*str)
{
SendASC(*str);
str++;
i++;
if(i == 12)break;
}
}
//发送text短信,AT+CMGS=”+8613718391984“
//*dialnum 目的号码 *text短信内容
//返回:1发送成功 0发送失败
uchar TransmitText(uchar *dialnum,uchar *text)
{
uchar i =10,j =10;
uchar *p;
while(i--)
{
RxPoint = 0;
SendString("AT+CMGS="); //发送指令
SendASC('"');
Send_PhoneNum(dialnum); //号码
SendASC('"');
SendASC('\r'); //回车
while(flag==0);
flag=0;
delay_ms(300);
p = LookFor_Str(RxBuf,">"); //检测是否接收到>
if(p!= 0)
{
RxPoint = 0; //清空接收缓冲区
SendString(text); //发送短信内容
delay_ms(1000);
SendString("\x1a\r"); //发送结束标志
while(flag== 0);
flag = 0;
delay_ms(5000);
p= LookFor_Str(RxBuf,"OK"); //检测是否接收到OK
if(p!= 0)
{
P1 = 0;
delay_ms(100);
P1 = 1;
return 1;
}
}
delay_ms(1000);
}
return 0;
}
//完整的短信发送函数
//dialnum:手机号 text:短息内容
void Send_Message(uchar *dialnum,uchar *text)
{
Send_AT(); //发送AT
//SendASC('\r');
delay_ms(5000);
Set_Mode(1); //设置短信模式:text
delay_ms(5000);
TransmitText(dialnum,text);
}
void main()
{
flag = 1;
//SendASC(0xaa);
USART_Init();
//while(1)
//{
Send_AT();
SendASC('\r');
Send_Message(PhoneNum,MsContent);
//}
}
void USART_Interrupt() interrupt 4
{
EA = 0;
flag = 1;
if((RxPoint<RxBuf_N)&&RI) //必须判断RI是否为1
{
RI = 0;
RxBuf[RxPoint++]=SBUF;
}
RI = 0;
EA = 1;
}
这是一条镜像帖。来源:北邮人论坛 / circuit / #20902同步于 2012/7/25
Circuit机器人发帖
求指导:51单片机控制TC35发送text短信
sdfenger
2012/7/25镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。