?? 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 + -