?? 51.txt
字號(hào):
單片機(jī)控制GSM模塊Tc35i
最近在做畢業(yè)設(shè)計(jì)用到GSM無(wú)線模塊進(jìn)行短信數(shù)據(jù)發(fā)送接收,在使用8位單片機(jī)控制Tc35i
發(fā)送端程序如下:
#include "reg51.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
uchar RsBuf[24];
uchar FlagRs = 0;
char code Init_Tc35i[] = "^SYSSTART";
char code AT_Tc35i[] = "AT+"; //連機(jī)
char code Send_Tc35i[] = "CMGS="; //發(fā)送信息
char code AT_Code[]="OK";
char code SK[]=">";
char code PhonNum[] = "15880022125";
char code Test[] = "test123";
//延時(shí)t毫秒
void Delay(uchar t)
{
uint i;
while(t--)
{
for(i=0;i<125;i++)
{}
}
}
//串口初始化
void InitCom(void)
{
SCON = 0x50;//串口方式1,8位UART
TMOD = 0x20;//定時(shí)器T1,工作方式2,8位重載
PCON = 0x80;//波特率加倍
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //T1開始
ES = 1;
}
//發(fā)送一個(gè)ASCII
void SendASC(uchar ASC)
{
bit es;
es = ES;
ES = 0;
TI = 0;
SBUF = ASC;
while(!TI);
TI = 0;
ES = es;
}
//發(fā)送命令到Tc35i
void SendComTc35i(uchar *p,uchar Long)
{
while(Long--)
{
SendASC(*p++);
}
}
// 通訊中斷接收程序
void Rs232_Rxd(void) interrupt 4 using 1
{
if(RI==1)
{
RI=0;
RsBuf[FlagRs++]=SBUF;
if(FlagRs>=sizeof(RsBuf))
{
FlagRs=0;
}
}
}
//搜索Tc35i
void Search_Tc35i(void)
{
uchar *p;
while(1)
{
ES = 1;
p = strstr(RsBuf,Init_Tc35i);
if(p != NULL) break;
}
}
//清緩沖區(qū)
void ClrRsBuf()
{
uchar len;
len = strlen(RsBuf);
while(len--)
{
RsBuf[FlagRs++] = 0;
}
}
// 發(fā)送AT連機(jī)命令
void Send_AT(void)
{
uchar *p;
while(1)
{
ClrRsBuf();
SendComTc35i(AT_Tc35i,2); //"AT"
SendASC(0x0d);
ES=1; //等待應(yīng)答"OK"
Delay(1000);
Delay(1000);
p=strstr(RsBuf,AT_Code);
if(p!=NULL) break;
}
}
//發(fā)送短信息
void SendMsgStart(void)
{
uchar *p,i=250;
SendComTc35i(AT_Tc35i,3); //"AT+"
SendComTc35i(Send_Tc35i,sizeof(Send_Tc35i)-1);//"AT+CMGS="
SendASC(0x22);
SendComTc35i(PhonNum,sizeof(PhonNum)-1);
SendASC(0x22); //"AT+CMGS="PhonNum""
SendASC(0x0d);
ES=1;
while(i--)
{
Delay(1500); //Get">"
p=strstr(RsBuf,SK);//">"
if(p!=NULL)
{
ClrRsBuf();
Delay(1000); //Get">"
break;
}
}
}
void main(void)
{
EA = 1;
InitCom();
Delay(1000);
Search_Tc35i();
Delay(1000);
Send_AT();
Delay(1000);
SendMsgStart();
Delay(1000);
SendComTc35i(Test,sizeof(Test)-1);
SendASC(0x1a);
}
上面是單片機(jī)控制GSM模塊的測(cè)試代碼,出現(xiàn)問題如下:
1、首先,主程序中并沒有循環(huán),但是在程序運(yùn)行主函數(shù)時(shí)卻出現(xiàn)循環(huán)現(xiàn)象??!
2、主函數(shù)加了Search_Tc35i()函數(shù)時(shí),程序運(yùn)行到Send_AT()進(jìn)入while循環(huán),不斷發(fā)送AT等待返回OK,結(jié)果程序卻會(huì)無(wú)由地?cái)嗟簦菜剖桥茱w了);但是去掉了Search_Tc35i()后整個(gè)程序運(yùn)行正常~~~
至今也找不出問題所在,懇請(qǐng)大家指點(diǎn)迷津!
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -