?? m32.c
字號(hào):
#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]; // 短消息服務(wù)中心號(hào)碼(SMSC地址)
char xdata TPA[16]; // 目標(biāo)號(hào)碼或回復(fù)號(hào)碼(TP-DA或TP-RA)
char xdata TP_PID; // 用戶信息協(xié)議標(biāo)識(shí)(TP-PID)
char xdata TP_DCS; // 用戶信息編碼方式(TP-DCS)
char xdata TP_SCTS[16]; // 服務(wù)時(shí)間戳字符串(TP_SCTS), 接收時(shí)用到
char xdata TP_UD[161]; // 原始用戶信息(編碼前或解碼后的TP-UD)
int xdata index; // 短消息序號(hào),在讀取時(shí)用到
int xdata PhoneNumber; //存電話號(hào)碼用
char xdata cmd[16]; // 命令串
char xdata pdu[256]; // PDU串
char xdata ans[256]; // 應(yīng)答串
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結(jié)束
{
putbyte(*puts);
getUartWait();
//getbyte();
//putbyte1(getbyte());
}
ClearBuf(ans,256);
}
void gsmInitPhoneBook(void)
{
ATSend("AT+CPBS=\"SM\"\r"); //SIM 卡作為電話簿存儲(chǔ)體。
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; //第二個(gè)"后面清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; // 串口收到的數(shù)據(jù)長度
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); // 根據(jù)PDU參數(shù),編碼PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z結(jié)束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息長度
nSmscLength++; // 加上長度字節(jié)本身
// 命令中的長度,不包括SMSC信息長度,以數(shù)據(jù)字節(jié)計(jì)
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); // 得到肯定回答,繼續(xù)輸出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: 目標(biāo)編碼串指針
* nSrcLength: 源字符串長度
* 返回: 目標(biāo)編碼串長度
***************************************************************************************/
int gsmEncode7bit(char xdata* pSrc, unsigned char xdata* pDst, int nSrcLength)
{
int xdata nSrc; // 源字符串的計(jì)數(shù)值
int xdata nDst; // 目標(biāo)編碼串的計(jì)數(shù)值
int xdata nChar; // 當(dāng)前正在處理的組內(nèi)字符字節(jié)的序號(hào),范圍是0-7
unsigned char xdata nLeft; // 上一字節(jié)殘余的數(shù)據(jù)
// 計(jì)數(shù)值初始化
nSrc = 0;
nDst = 0;
// 將源串每8個(gè)字節(jié)分為一組,壓縮成7個(gè)字節(jié)
// 循環(huán)該處理過程,直至源串被處理完
// 如果分組不到8字節(jié),也能正確處理
while(nSrc<nSrcLength)
{
// 取源字符串的計(jì)數(shù)值的最低3位
nChar = nSrc & 7;
// 處理源串的每個(gè)字節(jié)
if(nChar == 0)
{
// 組內(nèi)第一個(gè)字節(jié),只是保存起來,待處理下一個(gè)字節(jié)時(shí)使用
nLeft = *pSrc;
}
else
{
// 組內(nèi)其它字節(jié),將其右邊部分與殘余數(shù)據(jù)相加,得到一個(gè)目標(biāo)編碼字節(jié)
*pDst = (*pSrc << (8-nChar))| nLeft;
// 將該字節(jié)剩下的左邊部分,作為殘余數(shù)據(jù)保存起來
nLeft = *pSrc >> nChar;
// 修改目標(biāo)串的指針和計(jì)數(shù)值
pDst++;
nDst++;
}
// 修改源串的指針和計(jì)數(shù)值
pSrc++;
nSrc++;
}
// 返回目標(biāo)串長度
return nDst;
}
// 字節(jié)數(shù)據(jù)轉(zhuǎn)換為可打印字符串 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源數(shù)據(jù)指針
// pDst: 目標(biāo)字符串指針
// nSrcLength: 源數(shù)據(jù)長度
// 返回: 目標(biāo)字符串長度
int gsmBytes2String(uchar xdata * pSrc, char xdata* pDst, int nSrcLength)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -