📄 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]; //定义串口接收数据缓冲区
xdata char CheckBuf[8]; //定义检测数据缓冲区
uint RsPoint =0; //RsBuf[]坐标
char *ReturnCommand_OffSet;
char Index_Tc35[2]={0,0};
//\n0891..换行符'\10''\0'
char code Ask_Tc35[]={0x0a,0x30,0x38,0x00};
/**********************发送中文的帧格式(PDU格式)*************************************
08:短信息信元SMSC(短信息中心号码)的字节长度
91:短信息中心号码类型,91表明中心号码是国际通用电话号码。
683108700505F0:短信息中心号码:8613800750500。
11:PDU SMS发送的文件头字节。这里11指正常发送短信息。
00:信息类型。这里00指让手机自动加上主叫号码。
0B:被叫号码长度。
81:被叫号码类型。
3124525366F5:被叫号码13422535665。
00:PID Protocol Identifier.协议识别符,1位数字
08:DCS Data Coding Scheme 短信息编码类型.00:发送数字或者字符 08:内容是汉字,采用UNICODE编码
A9:VP Validity Period 短消息发送的合法期限,0、1或7位数字,其计算方法依照下表。
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"; //接收的手机号码(中文) 万胜
char code SMS_PDV[]="0008A9"; //PID DCS VP
char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01"; //有人入侵你的车!//用户数据长度 +用户数据 注:一个汉字占两个字节
char code SMS_OVER[]="\x1A\r"; //
char code SendSmg_UDL[]="30"; ////发送信息,数据长度为 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"}; //调试用的
xdata char databuf[databuf_N];
unsigned char tmp;
unsigned char Rt=1;
unsigned int databyte;
unsigned char seg_count; //逗号计数器
xdata char seg[20];
unsigned char byte_count; //位数计数器
unsigned char cmd_number; //命令类型
unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full; //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[8]; //命令类型存储数组
unsigned char MaySendGPS=0;
//声明函数原型
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;
}
/*********关闭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;
}
/*********************发送-个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;
}
/***********************字符串查找********************************
*功 能: 查找字符串
*形 参: 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;
}
/*********************转换北京时间*******************
*功 能: 将GPS收到的格林尼治时间转化北京时间
*形 参:
*返 回 值:
*备 注: 北京时间=格林尼治时间+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;} //当大于24时,减去24
databuf[seg[3]+1]=hour/10+48; //回存到缓冲区
databuf[seg[3]+2]=hour%10+48;
}
/***************************将数字转换成字符输出(ascll码)**************************/
void NumToChar(unsigned char i)
{
if(i>=0&&i<=9) //数字小于10
{
SendASC(i+48);
}
else if(i<=99)//数字小于100
{
SendASC(i/10+48);
SendASC(i%10+48);
}
else //数字大于100
{
SendASC(i/100+48);
SendASC(i%100/10+48);
SendASC(i%10+48);
}
}
/******************获取索引号并将信息索引转换成数字存入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;
}
/***********************发送联机指令******************************
*功 能: 串口发送数组命令到TC35,"AT",
*形 参:
*返 回 值:
*备 注: 测试GSM模块是否连接正确
**************************************************************** */
void Send_AT(void){
uchar *p,i=ATwaits;
while(i--){
SendString("AT\r"); //"AT"
//****************************等待应答"OK"
ES=1; //必须中断
delayms(150);
p=mystrstr(RsBuf,"OK");
if(p!=NULL) {
SendString(p);
delayms(1000);
delayms(1000);
break;
}
delayms(1000);
}
}
/***********************发送中文**********************************
*功 能:
*形 参:
*返 回 值: 信息数据内容首地址,从UDL开始
*备 注: 1 发送成功 0 发送失败
****************************************************************/
void Send_Chinese()//发送定位命令
{
uchar i=Textwaits;
uchar j=Sendwaits;
uchar *p;
RsPoint=0;
ClrBuf(RsBuf,8); //清除串口接收缓冲区前8字节
ES=1;
//串口发送"PDU模式"指令
SendString("AT+CMGF=0\r");
delayms(1000);
//发送信息,数据长度为 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=??? 48 注:一个汉字占两个字节
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"; //接收的手机号码(中文)
char code SMS_PDV[]="0008A9"; //PID DCS VP
char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01"; //有人入侵你的车!//用户数据长度 +用户数据 注:一个汉字占两个字节
char code SMS_OVER[]="\x1A\r"; // \x 表示后面的是十六进制数,及表示发十六进制的1A加回车
char code SendSmg_UDL[]="30";////发送信息,数据长度为 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)
{
//成功发送
show delayms(1000);
i=0;
j=0;
}
show delayms(1000);
}
}
show delayms(1000);
}
}
/***********************读取短信,并判断******************************
*功 能: 读取短信,并判断是否"位置"两个字,
是: 向用户发送GPS信息
否:跳出循环
*形 参:
*返 回 值:
*备 注:
************************************************************************/
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);
//串口发送"PDU模式"指令
SendString("AT+CMGF=0\r");
delayms(1000);
SendString("AT+CMGR="); //向tc35i发送读信息指令"AT+CMGR="//
SendString(Index_Tc35); //输入Index_Tc35//
SendASC('\r'); //向tc35i发送回车指令//
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; //接收位数清空
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;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -