⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm_task.c

📁 GSM模块子程序
💻 C
📖 第 1 页 / 共 3 页
字号:
					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 + -