?? tc35.c
字號:
extern void delayms(uint z);
/***********************************TC35定義****************************************/
sbit Start_TC35_IGT=P3^6; // 啟動TC35-
sbit Close_TC35_PD=P3^7;
#define ATwaits 10
#define Textwaits 10
#define Readwaits 10
#define Sendwaits 10
#define UD_OffSet 74 //在PDU模式下,UD在RsBuf的首地址
#define NewIdex_OffSet 12
#define RsBuf_N 150
#define databuf_N 77
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
xdata char RsBuf[RsBuf_N]; //定義串口接收數(shù)據(jù)緩沖區(qū)
xdata char CheckBuf[8]; //定義檢測數(shù)據(jù)緩沖區(qū)
uint RsPoint =0; //RsBuf[]坐標(biāo)
char *ReturnCommand_OffSet;
char Index_Tc35[2]={0,0};
//\n0891..換行符'\10''\0'
char code Ask_Tc35[]={0x0a,0x30,0x38,0x00};
/**********************發(fā)送中文的幀格式(PDU格式)*************************************
08:短信息信元SMSC(短信息中心號碼)的字節(jié)長度
91:短信息中心號碼類型,91表明中心號碼是國際通用電話號碼。
683108700505F0:短信息中心號碼:8613800750500。
11:PDU SMS發(fā)送的文件頭字節(jié)。這里11指正常發(fā)送短信息。
00:信息類型。這里00指讓手機(jī)自動加上主叫號碼。
0B:被叫號碼長度。
81:被叫號碼類型。
3124525366F5:被叫號碼13422535665。
00:PID Protocol Identifier.協(xié)議識別符,1位數(shù)字
08:DCS Data Coding Scheme 短信息編碼類型.00:發(fā)送數(shù)字或者字符 08:內(nèi)容是漢字,采用UNICODE編碼
A9:VP Validity Period 短消息發(fā)送的合法期限,0、1或7位數(shù)字,其計算方法依照下表。
VP值 短消息有效時間長度
0~143 (VP+1)×5分鐘
144~167 12時+(VP-143)×30分
168~196 1天×(VP-166)
197~255 1周×(VP-192)
**************************************************************************************/
//char code SMS_SETUP[]="0891683108700505F01100OB81";
char code SMS_DA[]="3136810314F0"; //接收的手機(jī)號碼(中文) 萬勝
char code SMS_PDV[]="0008A9"; //PID DCS VP
char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01"; //有人入侵你的車!//用戶數(shù)據(jù)長度 +用戶數(shù)據(jù) 注:一個漢字占兩個字節(jié)
char code SMS_OVER[]="\x1A\r"; //
char code SendSmg_UDL[]="30"; ////發(fā)送信息,數(shù)據(jù)長度為 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=???
char code User_DA[]="13422535665";
/***********************************GPS定義****************************/
sbit GPS_EN=P1^7;
//xdata char databuf[70]={"$GPGGA,1114641,3002.3232,N,12206.1157,E,1,03,12.9,53.2,11.6,M,,*4A"}; //調(diào)試用的
xdata char databuf[databuf_N];
unsigned char tmp;
unsigned char Rt=1;
unsigned int databyte;
unsigned char seg_count; //逗號計數(shù)器
xdata char seg[20];
unsigned char byte_count; //位數(shù)計數(shù)器
unsigned char cmd_number; //命令類型
unsigned char mode; //0:結(jié)束模式,1:命令模式,2:數(shù)據(jù)模式
unsigned char buf_full; //1:整句接收完成,相應(yīng)數(shù)據(jù)有效。0:緩存數(shù)據(jù)無效。
unsigned char cmd[8]; //命令類型存儲數(shù)組
unsigned char MaySendGPS=0;
//聲明函數(shù)原型
void ClrBuf(unsigned char *p,uint size);
//void UART_init(void);
void SendASC(unsigned char ASC);
void SendToTc35(unsigned char* p,uint Long);
void SendString(unsigned char* p);
void Send_AT(void);
void NumToChar(unsigned char i);
void GetNewIndex(void);
char *mystrstr(char *s, char *t);
void Send_Chinese();
void ReadMsg();
void Send_GPS();
/*********開啟TC35模塊*********************/
void start_tc35(void)
{
Start_TC35_IGT=0; //sbit Start_TC35_IGT=P3^7;
delayms(400);
Start_TC35_IGT=1; //sbit Start_TC35_IGT=P3^7;
}
/*********關(guān)閉TC35模塊*********************/
void close_tc35(void)
{
Close_TC35_PD=0; //sbit Close_TC35_PD=P3^6;
delayms(4000);
Close_TC35_PD=1; //sbit Close_TC35_PD=P3^6;
}
/*********************發(fā)送-個ASCII********************************
*功 能: 串口發(fā)送ASCII碼
*形 參: ASC
*返 回 值:
*備 注:
*****************************************************************/
void SendASC(uchar ASC)
{
bit es;
es=ES;
ES=0;//關(guān)閉中斷
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
}
/**********************發(fā)送-個數(shù)組********************************
*功 能: 串口發(fā)送數(shù)組命令到TC35,為指定長度
*形 參: uchar* p,數(shù)組首地址; uchar Long為數(shù)組長度
*返 回 值:
*備 注:
*****************************************************************/
void SendToTc35(uchar* p,uint Long)
{
while(Long--)
{
SendASC(*p++);
}
}
/**********************發(fā)送-個字符串******************************
*功 能: 串口發(fā)送數(shù)組命令到TC35,未指定長度
*形 參: uchar* p,字符串首地址;
*返 回 值:
*備 注:
*****************************************************************/
void SendString(uchar* p)
{
while(*p)
{
SendASC(*p++);
}
}
/***********************擦察除緩沖區(qū)*****************************/
void ClrBuf(uchar *p,uint size)
{
uint i;
for(i=0;i<size;i++)*p++=0;
}
/***********************字符串查找********************************
*功 能: 查找字符串
*形 參: char *s, char *t ;在s中查找t
*返 回 值: s_temp(t在s中的位置)成功 0 失敗
*備 注:
*****************************************************************/
char *mystrstr(char *s, char *t)
{
char *s_temp; /*the s_temp point to the s*/
char *m_temp; /*the mv_tmp used to move in the loop*/
char *t_temp; /*point to the pattern string*/
if (NULL == s || NULL == t) return NULL;
/*s_temp point to the s string*/
for (s_temp = s; *s_temp != '\0'; s_temp++){
/*the move_tmp used for pattern loop*/
m_temp = s_temp;
/*the pattern string loop from head every time*/
for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
/*if at the tail of the pattern string return s_tmp*/
if (*t_temp == '\0') return s_temp;
}
return NULL;
}
/*********************轉(zhuǎn)換北京時間*******************
*功 能: 將GPS收到的格林尼治時間轉(zhuǎn)化北京時間
*形 參:
*返 回 值:
*備 注: 北京時間=格林尼治時間+8
**************************************************************** */
void Time_Change (void)
{
unsigned char hour_shi,hour_ge,hour;
hour_shi=databuf[seg[3]+1]-48;
hour_ge=databuf[seg[3]+2]-48;
hour_shi=hour_shi*10;
hour=hour_shi+hour_ge+8;
if(hour>23) {hour=hour-24;} //當(dāng)大于24時,減去24
databuf[seg[3]+1]=hour/10+48; //回存到緩沖區(qū)
databuf[seg[3]+2]=hour%10+48;
}
/***************************將數(shù)字轉(zhuǎn)換成字符輸出(ascll碼)**************************/
void NumToChar(unsigned char i)
{
if(i>=0&&i<=9) //數(shù)字小于10
{
SendASC(i+48);
}
else if(i<=99)//數(shù)字小于100
{
SendASC(i/10+48);
SendASC(i%10+48);
}
else //數(shù)字大于100
{
SendASC(i/100+48);
SendASC(i%100/10+48);
SendASC(i%10+48);
}
}
/******************獲取索引號并將信息索引轉(zhuǎn)換成數(shù)字存入Index_Tc35***************************/
void GetNewIndex(void)
{
if(*(ReturnCommand_OffSet+NewIdex_OffSet)>=0x30&&*(ReturnCommand_OffSet+NewIdex_OffSet)<=0x39) //其中index表示短消息存放的位置
Index_Tc35[0]=*(ReturnCommand_OffSet+NewIdex_OffSet);
else Index_Tc35[0]=0;
if(*(ReturnCommand_OffSet+NewIdex_OffSet+1)>=0x30&&*(ReturnCommand_OffSet+NewIdex_OffSet+1)<=0x39)
Index_Tc35[1]=*(ReturnCommand_OffSet+NewIdex_OffSet+1);
else Index_Tc35[1]=0;
}
/***********************發(fā)送聯(lián)機(jī)指令******************************
*功 能: 串口發(fā)送數(shù)組命令到TC35,"AT",
*形 參:
*返 回 值:
*備 注: 測試GSM模塊是否連接正確
**************************************************************** */
void Send_AT(void){
uchar *p,i=ATwaits;
while(i--){
SendString("AT\r"); //"AT"
//****************************等待應(yīng)答"OK"
ES=1; //必須中斷
delayms(150);
p=mystrstr(RsBuf,"OK");
if(p!=NULL) {
SendString(p);
delayms(1000);
delayms(1000);
break;
}
delayms(1000);
}
}
/***********************發(fā)送中文**********************************
*功 能:
*形 參:
*返 回 值: 信息數(shù)據(jù)內(nèi)容首地址,從UDL開始
*備 注: 1 發(fā)送成功 0 發(fā)送失敗
****************************************************************/
void Send_Chinese()//發(fā)送定位命令
{
uchar i=Textwaits;
uchar j=Sendwaits;
uchar *p;
RsPoint=0;
ClrBuf(RsBuf,8); //清除串口接收緩沖區(qū)前8字節(jié)
ES=1;
//串口發(fā)送"PDU模式"指令
SendString("AT+CMGF=0\r");
delayms(1000);
//發(fā)送信息,數(shù)據(jù)長度為 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=??? 48 注:一個漢字占兩個字節(jié)
SendString("AT+CMGS=");
SendString(SendSmg_UDL);
SendASC('\r');
RsPoint=0;
ES=1;
while(i--)
{
delayms(1000);
p=mystrstr(RsBuf,">"); //////Get">"
if(p!=NULL)
{
SendString("0891683108700505F011000B81");
SendString(SMS_DA); // 5113632843F5 恒 3136810314F0 勝
SendString(SMS_PDV); // 0008A9
SendString(SMS_UD); // 1067094EBA51654FB54F6076848F66FF01
SendString(SMS_OVER);
/*
char code SMS_DA[]="3124525366F5"; //接收的手機(jī)號碼(中文)
char code SMS_PDV[]="0008A9"; //PID DCS VP
char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01"; //有人入侵你的車!//用戶數(shù)據(jù)長度 +用戶數(shù)據(jù) 注:一個漢字占兩個字節(jié)
char code SMS_OVER[]="\x1A\r"; // \x 表示后面的是十六進(jìn)制數(shù),及表示發(fā)十六進(jìn)制的1A加回車
char code SendSmg_UDL[]="30";////發(fā)送信息,數(shù)據(jù)長度為 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=???
char code User_DA[]="13422535665"; */
delayms(10);
//RsPoint=0;
while(j--)
{
p=mystrstr(RsBuf,"OK");
if(NULL!=p)
{
//成功發(fā)送
show delayms(1000);
i=0;
j=0;
}
show delayms(1000);
}
}
show delayms(1000);
}
}
/***********************讀取短信,并判斷******************************
*功 能: 讀取短信,并判斷是否"位置"兩個字,
是: 向用戶發(fā)送GPS信息
否:跳出循環(huán)
*形 參:
*返 回 值:
*備 注:
************************************************************************/
void ReadMsg()
{
uchar *p,i=0;
uchar j=Sendwaits;
ClrBuf(RsBuf,8);
RsPoint=0;
ES=1;
//獲取索引號Index_Tc35[]={0,0};
GetNewIndex();
delayms(1000);
SendString("AT\r");
delayms(1000);
//串口發(fā)送"PDU模式"指令
SendString("AT+CMGF=0\r");
delayms(1000);
SendString("AT+CMGR="); //向tc35i發(fā)送讀信息指令"AT+CMGR="//
SendString(Index_Tc35); //輸入Index_Tc35//
SendASC('\r'); //向tc35i發(fā)送回車指令//
RsPoint=0;
ES=1;
while(j--){
delayms(1000);
p=mystrstr(RsBuf,Ask_Tc35);
if(p!=NULL)
{
P1_5=0;
for(i=0;i<8;i++)
CheckBuf[i]=RsBuf[74+i]; ;
p=mystrstr(CheckBuf,"4F4D7F6E");
if(p!=NULL){
P1_6=0;
Send_GPS();}
}
}
}
/******************* 串口通訊中斷接收程序*************************/
void Seril() interrupt 4 using 1
{
if(RI==1)
{
RI=0;
tmp=SBUF;
RsBuf[RsPoint++]=tmp;
RsBuf[RsPoint]=0x00;
/////////////////////////////////////////////
if(Rt==1&&GPS_EN==0)
{
if(tmp=='$')
{
P1_0=0;
cmd_number=0; //命令類型清空
mode=1; //接收命令模式
byte_count=0; //接收位數(shù)清空
seg_count=1;
}
if(mode==1)
{
P1_1=0;
cmd[byte_count]=tmp;
byte_count++;
if(tmp==',')
{
P1_2=0;
mode=2;
seg_count=2;
}
}
if(mode==2)
{ P1_3=0;
if(cmd[1]=='G'&&cmd[2]=='P'&&cmd[3]=='G'&&cmd[4]=='G'&&cmd[5]=='A')
{
databyte=0;
mode=3;
}
}
if(mode==3)
{ if(tmp==',')
{
seg_count++;
seg[seg_count]=databyte;
}
databuf[databyte]=tmp;
databyte++;
if(tmp=='*')
{ P1_4=0;
databuf[databyte+1]=0x0A;
databuf[databyte+2]=0x0d;
Rt=0;
}
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -