📄 m32.c
字号:
#include <w77e58.h>
#include "global.h"
#include "io.h"
#include "timer.h"
#include "serial.h"
#include "m32.h"
extern bit GPSReady;
bit AlarmFlag;
extern bit GPSav; //1 = A
bit GPSTimerReq;
extern UINT16 idata GPSTimer30;
#define _1_SEC 35
#define _2_SEC 70
#define _5_SEC 150
#define _10_SEC 300
#define _30_SEC 900
//用户信息编码方式
#define GSM_7BIT 0
#define GSM_8BIT 4
#define GSM_UCS2 8
char xdata SCA[16]; // 短消息服务中心号码(SMSC地址)
char xdata TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
char xdata TP_PID; // 用户信息协议标识(TP-PID)
char xdata TP_DCS; // 用户信息编码方式(TP-DCS)
char xdata TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
char xdata TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
int xdata index; // 短消息序号,在读取时用到
int xdata PhoneNumber; //存电话号码用
char xdata cmd[16]; // 命令串
char xdata pdu[256]; // PDU串
char xdata ans[256]; // 应答串
char idata gsm_task;
//int aLength;
extern uchar idata SysTimer;
extern uchar xdata JWDMode;
extern UINT32 xdata Speed;
extern UINT32 xdata LonDeg,LonMin1,LonMin2,LatDeg,LatMin1,LatMin2;
extern UINT32 xdata xYear,xMonth,xDay;
extern UINT32 xdata xHour,xMin,xSec;
int gsmSearchPhone(uchar* flag);
int gsmString2Bytes(uchar* pSrc, uchar* pDst, int nSrcLength);
int gsmEncodePdu(char xdata* pDst); //pDst=pdu;
//void gsmGreateSmsHD(void); //SMS header
void ClearBuf(uchar* Buff,int size)
{
int xdata i;
for(i=0;i<size;i++)
{
Buff[i]=0;
}
}
void ATSend(uchar* puts)
{
for (;*puts!=0;puts++) //遇到停止符0结束
{
putbyte(*puts);
getUartWait();
//getbyte();
//putbyte1(getbyte());
}
ClearBuf(ans,256);
}
void gsmInitPhoneBook(void)
{
ATSend("AT+CPBS=\"SM\"\r"); //SIM 卡作为电话簿存储体。
PhoneNumber = 1;
}
#if 1
BOOL gsmSavePhone(uchar* phone,uchar* flag)
{
int xdata n;
uchar xdata* ptr;
ClearBuf(ans,256);
sprintf(ans,"AT+CPBW=");
#if 1
sprintf(cmd,"%d",PhoneNumber);
strcat(ans,cmd);
#endif
strcat(ans,",\"");
strcat(ans,phone);
strcat(ans,"\",129,\"");
strcat(ans,flag);
strcat(ans,"\"\r");
putstring1(ans);
putstring1("\r\n");
ATSend(ans);
ReadSerail(ans, 128, &n,5);
if((ptr=strstr(ans,"+CME ERROR:"))== NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
#endif
#if 1
BOOL gsmDeletePhone(int index)
{
int xdata i,n;
sprintf(cmd,"AT+CPBW=");
sprintf(ans,"%d",index);
strcat(cmd,ans);
strcat(cmd,"\r\n");
ATSend(cmd);
ReadSerail(ans, 120, &n,5);
if((strstr(ans,"OK")) != NULL) return TRUE;
return FALSE;
}
#endif
#if 1
int gsmSearchPhone(uchar* flag)
{
int xdata n;
uchar xdata* ptr;
ClearBuf(ans,256);
sprintf(ans,"AT+CPBF=\"");
strcat(ans, flag);
strcat(ans,"\"\r\n");
ATSend(ans);
ReadSerail(ans, 256, &n,5);
if((ptr=strstr(ans,"+CPBF: ")) != NULL)
{
//putstring1(ptr);
//putstring1("\r\n");
ptr +=6;
sscanf(ptr, "%d", &n);
return n;
}
else
{
return 0;
}
}
#endif
uchar* gsmCheckRightNumber(uchar* text,BOOL phone) //phone=1,get phone number to SCA;else cmp SCA and TPA.
{
int xdata i,n;
uchar xdata Number[16];
uchar xdata * ptr;
sprintf(ans,"AT+CPBF=\"");
strcat(ans, text);
strcat(ans,"\"\r\n");
strcpy(cmd,ans);
putstring1("cmd:\r\n");
putstring1(cmd);
putstring1("\r\n");
i=5;
while(i--)
{
ATSend(cmd);
ReadSerail(ans, 256, &n,5);
if((ptr=strstr(ans,"+CPBF: ")) != NULL) break;
else
if(strstr(ans,"RING") != NULL) return 0;;
}
if(i==0)return 0;
while(1)
{
ATSend(cmd);
ReadSerail(ans, 256, &n,5);
putstring1("ans=:\r\n");
putstring1(ans);
putstring1("\r\n");
if((ptr=strstr(ans,"+CPBF: ")) != NULL)
{
ptr +=6; //skip [+CPBF ]
if((ptr=strstr(ptr,",\"")) != NULL)
{
if(strncpy(Number,ptr,16) != NULL)
{
for(i=0;i<16;i++)
{
if((Number[i]=='\"') && (Number[i+1]==','))
{
Number[i]=0; //第二个"后面清0;
Number[0]=TPA[0];
Number[1]=TPA[1];
putstring1("Number=:\r\n");
putstring1(Number);
putstring1("\r\n");
putstring1("TPA=:\r\n");
putstring1(TPA);
putstring1("\r\n");
if(phone==1)return Number;
if(strncmp(Number,TPA,strlen(TPA))==0)
{
//is right number,go on next.
return Number;
}
return NULL;
}
}//for(i=0;i<16;i++)
}//if(strncpy(SCA,ptr,16) != NULL)
}//if((ptr=strstr(ptr,",\"")) != NULL)
else
return NULL;
}//if((ptr=strstr(ans,"+CPBF: ")) != NULL)
else
return NULL;
} //while(1)
}
#if 1
int gsmGetRightNumber(uchar* text)
{
uchar xdata* ptr;
if((ptr=gsmCheckRightNumber(text,1))==NULL) return 0;
strcpy(TPA,ptr);
putstring1("You have Right Name is:\r\n");
putstring1(text);
putstring1("\r\n");
putstring1("You have Right Number is:\r\n");
putstring1(TPA);
putstring1("\r\n");
return 1;
}
#endif
BOOL gsmSendMessage(void)
{
int xdata nPduLength; // PDU串长度
unsigned char xdata nSmscLength; // SMSC串长度
int xdata nLength; // 串口收到的数据长度
uchar xdata* ptr;
TPA[0]=SCA[0];
TPA[1]=SCA[1];
putstring1("Send Message Start:\r\n");
putstring1("SCA=:\r\n");
putstring1(SCA);
putstring1("\r\n");
putstring1("TPA=:\r\n");
putstring1(TPA);
putstring1("\r\n");
nPduLength = gsmEncodePdu(pdu); // 根据PDU参数,编码PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength/2 - nSmscLength); // 生成命令
while(1)
{
ATSend(cmd);
ReadSerail(ans, 128, &nLength,5);
if((ptr=strstr(ans,"\r\n> ")) != NULL)
{
ATSend(pdu); // 得到肯定回答,继续输出PDU串
ReadSerail(ans, 128, &nLength,5);
if((strstr(ans, "+CMGS: ")) == NULL)
{
putbyte('\r');
delay_ms(20);
putstring1("SMSC Send Ok!\r\n");
return 1;
}
else
{
putstring1("SMSC ANSWER:Err\r\n");
putstring1(ans);
putstring1("\r\n");
putbyte('\r');
delay_ms(20);
ATSend("AT\r\n");
delay_ms(200);
}
}
else
{
putstring1("NO ANSWER:\r\n");
putstring1(ans);
putstring1("\r\n");
if((strstr(ans,"RING")) != NULL) return FALSE;
putbyte('\r');
delay_ms(20);
ATSend("AT\r\n");
delay_ms(200);
}
}
}
//List all phonebook entries:
// AT+CPBF="DA"
/************************************************************************************************
* int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
* 7-bit编码
* pSrc: 源字符串指针
* pDst: 目标编码串指针
* nSrcLength: 源字符串长度
* 返回: 目标编码串长度
***************************************************************************************/
int gsmEncode7bit(char xdata* pSrc, unsigned char xdata* pDst, int nSrcLength)
{
int xdata nSrc; // 源字符串的计数值
int xdata nDst; // 目标编码串的计数值
int xdata nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
unsigned char xdata nLeft; // 上一字节残余的数据
// 计数值初始化
nSrc = 0;
nDst = 0;
// 将源串每8个字节分为一组,压缩成7个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到8字节,也能正确处理
while(nSrc<nSrcLength)
{
// 取源字符串的计数值的最低3位
nChar = nSrc & 7;
// 处理源串的每个字节
if(nChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
nLeft = *pSrc;
}
else
{
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
*pDst = (*pSrc << (8-nChar))| nLeft;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> nChar;
// 修改目标串的指针和计数值
pDst++;
nDst++;
}
// 修改源串的指针和计数值
pSrc++;
nSrc++;
}
// 返回目标串长度
return nDst;
}
// 字节数据转换为可打印字符串 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(uchar xdata * pSrc, char xdata* pDst, int nSrcLength)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -