📄 tc35i.c
字号:
/*********************本程序仅限学习交流***************************
*********************引用请注明作者 axin***************************
*************************文件名shijian.c***************************
*Copyright(C)2008 biti
*功能描述:GSM模块,发送短信,接收短信,转发短信
*作 者:axin
*日 期:2008-4-20
*QQ:35714796
*网 站:
********************本程序仅限学习交流****************************
********************引用请注明作者 axin***************************
*****************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define ATwaits 10
#define DWWwaits 10
#define Readwaits 10
#define Sendwaits 10
#define PDUType_OffSet 19
#define DCS_OffSet 35
#define UDL_OffSet 51
#define UD_OffSet 53
#define NewIdex_OffSet 12
#define SCX 1
#define WangYafei 2
#define YuanYudong 3
#define YangZhengang 4
#define XianGuanwen 5
#define RsBuf_N 400
xdata char RsBuf[RsBuf_N]; //定义串口接收数据缓冲区
uint RsPoint =0; //RsBuf[]坐标
uchar UDL =2;
char *P_UD =NULL;
char *P_UDL =NULL;
char *ReturnCommandOffSet;
char Index_Tc35[4]={0,0,0,0};
//\n0891..换行符'\10''\0'
char code Ask_Tc35[]={0x0a,0x30,0x38,0x00};
//定义转发号码
char code DialNum[][13]={
{"3118009151F5"}, //0,13810019155 WangYafei
{"3118618791F1"}, //1,13811678191 SCX
{"3118009151F5"}, //2,13810019155 WangYafei
{"3118614942F1"}, //3,13811694241 YuanYudong
{"3117571722F3"}, //4,13717571223 YangZhengang
{"3124261983F4"}, //5,13426291384 XianGuanwen
};
//声明函数原型
void ClrBuf(uchar *p,uint size);
void UART_init(void);
void SendASC(uchar ASC);
void SendToTc35(uchar* p,uint Long);
void SendString(uchar* p);
void Bell(void);
void Send_AT(void);
void SetPdu(void);
void NumIn(uchar i);
char EraseMsg(uchar index);
char *ReadMsg(uchar index);
char TransmitPDU(char *dialnum);
char ReciveNewStatusReport();
char ReciveNewMsg();
char *TransmitMsg(char *m);
char *mystrstr(char *s, char *t);
//模式设置初始化串口
void UART_init(void){
//初始化串行口和波特率发生器
SCON =0x58; //选择串口工作方式,打开接收允许
TMOD|=0x20; //定时器1工作在方式2,
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
//ET1=1;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许 //单片机中断允许
}
/*********************发送-个ASCII********************************
*功 能: 串口发送ASCII码
*形 参: ASC
*返 回 值:
*备 注:
*****************************************************************/
void SendASC(uchar ASC){
bit es;
es=ES;
ES=0;//关闭中断
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
}
/**********************发送-个数组********************************
*功 能: 串口发送数组命令到TC35,为指定长度
*形 参: uchar* p,数组首地址; uchar Long为数组长度
*返 回 值:
*备 注:
*****************************************************************/
void SendToTc35(uchar* p,uint Long){
while(Long--){
SendASC(*p++);
}
}
/**********************发送-个字符串******************************
*功 能: 串口发送数组命令到TC35,未指定长度
*形 参: uchar* p,字符串首地址;
*返 回 值:
*备 注:
*****************************************************************/
void SendString(uchar* p){
while(*p){
SendASC(*p++);
}
}
//察除缓冲区
void ClrBuf(uchar *p,uint size){
uint i;
for(i=0;i<size;i++)*p++=0;
}
/***********************发送联机指令******************************
*功 能: 串口发送数组命令到TC35,"AT",
*形 参:
*返 回 值:
*备 注: 测试GSM模块是否连接正确
*****************************************************************/
void Send_AT(void){
uchar *p,i=ATwaits;
while(i--){
SendString("AT\r");
//****************************等待应答"OK"
ES=1; //必须中断
delayms_100ms();
p=mystrstr(RsBuf,"OK");
if(p!=NULL) {
zhushi lcd_disp_str("GSM module is OK",1);
zhushi lcd_disp_str("Will contimue! ",2);
delayms_1000ms();delayms_1000ms();
zhushi lcd_disp_str(" ",1);
zhushi lcd_disp_str(" ",2);
break;
}
zhushi lcd_disp_str("No GSM connected",1);delayms_1000ms();
zhushi lcd_disp_str(" ",1);
}
}
//删除短信息
char EraseMsg(uchar index)
{
uchar i=10;
char *p;
ES=1;
SendString("AT+CMGD="); //向tc35i发送删除指令"AT+CMGD="//
if(index)NumIn(index); //如果index不为0输入index,//
else SendString(Index_Tc35);//否则输入Index_Tc35//
SendASC('\r'); //向tc35i发送回车指令//
while(i--)
{ //***等待应答"OK"***//
delayms_1000ms();
p=mystrstr(RsBuf,"OK");
if(p!=NULL) {
zhushi lcd_disp_str("EraseMsg finish!",1);
delayms_1000ms();
return 1;
}
}
zhushi lcd_disp_str("EraseMsg ufinish",1);
delayms_1000ms();
return 0;
}
//将数字转换成字符输出
void NumIn(uchar i){
//数字小于10
if(i>=0&&i<=9){
SendASC(i+48);
}
//数字小于100
else if(i<=99){
SendASC(i/10+48);
SendASC(i%10+48);
}
//数字大于100
else {
SendASC(i/100+48);
SendASC(i%100/10+48);
SendASC(i%10+48);
}
}
//将信息索引转换成数字存入Index_Tc35
void GetNewIndex(void){
if(*(ReturnCommandOffSet+NewIdex_OffSet)>=0x30&&*(ReturnCommandOffSet+NewIdex_OffSet)<=0x39)
Index_Tc35[0]=*(ReturnCommandOffSet+NewIdex_OffSet);
else Index_Tc35[0]=0;
if(*(ReturnCommandOffSet+NewIdex_OffSet+1)>=0x30&&*(ReturnCommandOffSet+NewIdex_OffSet+1)<=0x39)
Index_Tc35[1]=*(ReturnCommandOffSet+NewIdex_OffSet+1);
else Index_Tc35[1]=0;
Index_Tc35[2]=0;Index_Tc35[3]=0;
}
/***********************定位自己**********************************
*功 能: 给服务台10658204发送请求信息,定位自己
*形 参:
*返 回 值: 信息数据内容首地址,从UDL开始
*备 注: 1 发送成功 0 发送失败
*****************************************************************/
char RequestDWW()//发送定位命令
{ uchar i=DWWwaits;
uchar j=Sendwaits;
uchar *p;
RsPoint=0;
ClrBuf(RsBuf,8);
ES=1;
//发送信息,数据长度为15
SendString("AT+CMGS=15\r");
while(i--){
delayms_1000ms();
p=mystrstr(RsBuf,">");//////Get">"
if(p!=NULL)
{
SendString("00310008A1015628400000A703C4EB15\x1a\r");
//delayms_100ms();
while(j--){
//delayms_100ms();
p=mystrstr(RsBuf,"OK");
if(NULL!=p){
//成功发送
zhushi lcd_disp_str("Request finish! ",1);
zhushi delayms_1000ms();
//zhushi lcd_disp_str(" ",1);
//RsPoint=0;
//ClrBuf(RsBuf,8);
return 1;
}
zhushi lcd_disp_str("wait send DWW...",1);
zhushi delayms_1000ms();
//zhushi lcd_disp_str(" ",1);
}
}
zhushi lcd_disp_str("No \">\" ",1);
zhushi delayms_1000ms();
zhushi lcd_disp_str(" ",1);
}
return 0;
}
/***********************读取信息**********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -