📄 gsm_task.c
字号:
addr:表示要存入的地址
注意:当要存入的序号原有位置有号码的将替换原来的
当存入序号为0时,表示新增电话号码,序号将有模块分配
返回值:最后返回存入电话号码的序号
当返回0时,表示存入失败
*******************************************/
u8 StoreTelNum(TEL_BOOK* Telbook,u8 *addr)
{
u8 *ptr=NULL;
u8 i;
u8 cLength[5];
if(strcmp(addr,"SM")&&strcmp(addr,"FD"))
{/*非法的存储位置*/
return 0;
}
if(Telbook->num>250) /*大于存储的容量,根据SM卡的不同有异*/
{
return 0;
}
writeStrCom(COM_CDMA, FALSE, 0, "AT+CPBS=");
writeStrCom(COM_CDMA, FALSE, 0, "\"");
writeStrCom(COM_CDMA, FALSE, 0, addr);
writeStrCom(COM_CDMA, TRUE, 0, "\"");
ptr=waitAtCmd("OK",10);
if(!ptr)
{
return 0;
}
if(Telbook->num==0) /*没有指定序号,新增号码*/
{
for(i=0;i<5;i++) /*测试时有时写一次不成功*/
{
writeStrCom(COM_CDMA, FALSE, 0, "AT+CPBW=,\"");
writeStrCom(COM_CDMA, FALSE, 0, Telbook->phonenum);
writeStrCom(COM_CDMA, FALSE, 0, "\",129,\"");//根据号码类型确定129或者145
writeStrCom(COM_CDMA, FALSE, 0, Telbook->name);
writeStrCom(COM_CDMA, TRUE, 0, "\"");
ptr=waitAtCmd("OK",30);
if(ptr)
{
return 1;
}
}
if(!ptr)
{
return 0;
}
}
else /*存到指定的位置*/
{
int2BcdAscStr((char*)cLength,Telbook->num,3);/*序号转成转成十进制字符串*/
cLength[3]='\0';
for(i=0;i<5;i++) /*有时写一次不成功*/
{
writeStrCom(COM_CDMA, FALSE, 0, "AT+CPBW=");
writeStrCom(COM_CDMA, FALSE, 0, cLength);
writeStrCom(COM_CDMA, FALSE, 0, ",\"");
writeStrCom(COM_CDMA, FALSE, 0, Telbook->phonenum);
writeStrCom(COM_CDMA, FALSE, 0, "\",129,\"");/*根据号码类型确定129或者145*/
writeStrCom(COM_CDMA, FALSE, 0, Telbook->name);
writeStrCom(COM_CDMA, TRUE, 0, "\"");
ptr=waitAtCmd("OK",30);
if(ptr)
{
return 1;
}
}
if(!ptr)
{
return 0;
}
}
}
/********************************************
函数功能:查找电话号码信息
输入参数:sting:为查找的字段
Telbook:保存查找到的号码信息
返回值:查找到符合条件的返回1,没有查找到返回0
**********************************************/
u8 FindNum(u8 *string,TEL_BOOK* Telbook)
{
u8 i;
u8 *ptr=NULL;
u8 numbuf[4];
for(i=0;i<3;i++)
{
memset(g_CdmaRcvBuf,0x0,MSGSIZE_CDMA);
g_GsmCnt=0;
writeStrCom(COM_CDMA, FALSE, 0, "AT+CPBF=\"");
writeStrCom(COM_CDMA, FALSE, 0, string);
writeStrCom(COM_CDMA, TRUE, 0, "\"");
ptr=waitAtCmd("OK",30);
if(ptr) i=3;
}
if(ptr)
{
ptr=g_CdmaRcvBuf;
while((ptr=strstr(ptr,"+CPBF:"))!=NULL)
{
ptr+=7;/*跳过+CPBF:*/
for(i=0;i<3;i++)
{
if(*(ptr+i)!=',')
{
numbuf[i]=*(ptr+i);
}
else
{
numbuf[i]='\0';
break;
}
}
Telbook->num=(u8)bcdAscStr2Int(numbuf,i);
ptr=strstr(ptr,",\"");
ptr+=2;
for(i=0;i<20;i++)
{
if(*(ptr+i)!='\"')
{
Telbook->phonenum[i]=*(ptr+i);
}
else
{
Telbook->phonenum[i]='\0';
break;
}
}
ptr=strstr(ptr, ",\"");/*取联系人信息*/
ptr+=2;
for(i=0;i<30;i++)
{
if(*(ptr+i)!='\"')
{
Telbook->name[i]=*(ptr+i);
}
else
{
Telbook->name[i]='\0';
break;
}
}
Telbook++;
}
return 1;
}
return 0;
}
/******************************************************
函数功能:GPRS连接
输入参数:IPaddrss:表示服务器的IP地址
Com:端口号
model:表示连接的方式,1:UDP,0:TCP
返回值:1表示成功,0表示失败
*******************************************************/
u8 GprsConnect(u8 *IPaddrss,u16 Com,u8 model)
{
u8 i,len;
u8 cLength[4];
u8 *pDest=NULL;
memset(g_CdmaRcvBuf,0x0,MSGSIZE_CDMA);
g_GsmCnt=0;
writeStrCom(COM_CDMA, TRUE, 0, "AT#SKTTO=0");
//while(g_GsmCnt<16) ;
pDest=waitAtCmd("OK",10);
writeStrCom(COM_CDMA, TRUE, 0, "AT+CGATT=1");
pDest = waitAtCmd("OK",30);
if(!pDest)
{
return 0;
}
writeStrCom(COM_CDMA, TRUE, 0, "AT+CGDCONT=1,\"IP\",\"CMNET\"");
pDest = waitAtCmd("OK",10);
if(!pDest)
{
return 0;
}
writeStrCom(COM_CDMA, TRUE, 0, "AT#GPRS=1");
pDest = waitAtCmd("OK",50);
if(!pDest)
{
return 0;
}
int2BcdAscStr(cLength,Com,4);
if(model)
{
writeStrCom(COM_CDMA, FALSE, 0, "AT#SKTSET=1,");
}
else
{
writeStrCom(COM_CDMA, FALSE, 0, "AT#SKTSET=0,");
}
writeStrCom(COM_CDMA, FALSE, 0, cLength);
writeStrCom(COM_CDMA, FALSE, 0, ",\"");
writeStrCom(COM_CDMA, FALSE, 0, IPaddrss);
writeStrCom(COM_CDMA, TRUE, 0, "\"");
pDest = waitAtCmd("OK",10);
if(!pDest)
{
return 0;
}
RESET_WDT;
writeStrCom(COM_CDMA, TRUE, 0, "AT#SKTOP");
pDest = waitAtCmd("CONNECT",60);
if(pDest)
{
return 1;
}
return 0;
}
/**************************************
函数功能:断开GPRS
输入参数: 无
返回值:无
**************************************/
void DownGPRS()
{
dly20ms(250);
writeStrCom(COM_CDMA, FALSE, 0, "+++");
dly20ms(250);
}
/*****************************************
函数功能:拨打电话
输入参数:phonenum: 拨打的电话号码
返回值:无
*****************************************/
void call(u8 *phonenum)//打电话
{
u8 phoneno[15];
u8 j;
j=strlen(phonenum);
strcpy((char*)phoneno, "ATD");//拨号命令
if(j>11)
{
if(phonenum[0] == '8' && phonenum[1] == '6')
{
phonenum += 2;
}
if(phonenum[0] == '+' && phonenum[1] == '8' && phonenum[2] == '6')
{
phonenum += 3;
}
}
strcat((char*)phoneno, (char const *)phonenum);
j = strlen((char const*)phoneno);
phoneno[j++] = ';';
//phoneno[j++] =0x0D;
phoneno[j++] = '\0';
writeStrCom(COM_CDMA, TRUE, 0, phoneno);
}
/****************************************
函数功能:挂机操作
输入参数:无
返回值:操作成功返回1,失败返回0
*****************************************/
u8 downcall()
{
u8 *ptr=NULL;
writeStrCom(COM_CDMA, TRUE, 0, "ATH");
ptr = waitAtCmd("OK", 30);
if(ptr)
{
return 1;
}
return 0;
}
/*************************************
函数功能:接电话
输入参数:无
返回值:成功返回1,失败返回0
*************************************/
u8 answercall()
{
u8 *ptr=NULL;
writeStrCom(COM_CDMA, TRUE, 0, "ATA");
ptr = waitAtCmd("OK", 30);
if(ptr)
{
return 1;
}
return 0;
}
/******************************************************************
函数功能:等待AT指令回复
输入参数:*pRetCmd:预期返回的AT指令相应字符串
time:发送完AT指令到响应之间的延时时间,时间=time*100ms
返回值:返回*pRetCmd在接收字符串中的位置
*******************************************************************/
u8 *waitAtCmd( u8 *pRetCmd,u16 time)
{
u8 *pDest = NULL;
u16 lastGsmCnt = g_GsmCnt;
u16 dataLen;
dly20ms(5*time);
dataLen = g_GsmCnt - lastGsmCnt;
pDest = searchStr(g_CdmaRcvBuf+lastGsmCnt, pRetCmd, dataLen);
return pDest;
}
/*******************************************************************
函数功能:正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
如:"8613851872468" --> "683158812764F8"
输入参数:pSrc: 源字符串指针
pDst: 目标字符串指针
返回值: 目标字符串长度
*********************************************************************/
u16 gsmInvertNumbers(const char* pSrc,u8* pDst)
{
u16 nDstLength,nSrcLength; // 字符串长度
u16 ch; // 用于保存一个字符
nSrcLength=strlen(pSrc);
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(int i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 源串长度是奇数吗?
if(nSrcLength & 1)
{
*(pDst-2) = 'F'; // 补'F'
nDstLength++; // 目标串长度加1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
/*****************************************************
函数功能:两两颠倒的字符串转换为正常顺序的字符串
如:"683158812764F8" --> "8613851872468"
输入参数:pSrc: 源字符串指针
pDst: 目标字符串指针
返回值: 目标字符串长度
*******************************************************/
u16 gsmSerializeNumbers(const u8* pSrc, u8* pDst, u16 nSrcLength)
{
u16 nDstLength;
u8 ch; // 用于保存一个字符
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(int i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 最后的字符是'F'吗?
if(*(pDst-1) == 'F')
{
pDst--;
nDstLength--; // 目标字符串长度减1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
/*
// 7-bit编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标编码串的计数值
int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
unsigned char nLeft; // 上一字节残余的数据
// 计数值初始化
nSrc = 0;
nDst = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -