BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #20902同步于 2012/7/25
Circuit机器人发帖

求指导:51单片机控制TC35发送text短信

sdfenger
2012/7/25镜像同步0 回复
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; }
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。