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

📄 gprs.c

📁 这个是一个带有IC卡
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			GPRS.c
** Last modified Date:  2008-01-02
** Last Version:		1.0
** Descriptions:		GPRS function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			
** Created date:		
** Version:				
** Descriptions:		
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include "config.h"

#include "main.h"

#include "uart0.h"
#include "delay.h"
#include "lcm.h"

#define __SRC
#include"gprs.h"
#undef __SRC


volatile int gprs_timer = 0;
//uint8 const  SEND_STRING[] = "ATD13817164109;\r\n";			//打电话拨号
//uint8 const  SEND_STRING2[] = "ATH\r\n";					//停止拨号
//uint8 const  SEND_STRING1[] = "AT\r\n";						//测试用

//uint8 const  SEND_STRING3[] = "AT+CIPSTART=\"TCP\",\"58.25.217.143\",\"4000\"\r\n";	//建立GPRS_TCP连接
//uint8 const  SEND_STRING4[] = "AT+CIPCLOSE\r\n";									//关闭连接
//uint8 const  SEND_STRING5[] = "AT+CIPSEND\r\n";										//发送数据命令
//uint8 const  SEND_STRING6[] = "POST /db/Deal3S.asp HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: www.logcon.cn\r\nContent-Length: 150\r\ncode=701780&SwapTime=2007-10-30+22%3A15%3A39&SwapType=1&TermilogID=4&CardID=252222&DeliveryID=319891&DeliveryPointID=438144&GroupID=88358&LatticeID=1\032"; //
																					//发送的数据
const char GPRS_STRING_CR[] = "\r";
const char GPRS_STRING_CRLF[] = "\r\n";

const char GPRS_STRING_AT[] = "AT\r";
const char GPRS_STRING_AT_RET[] = "AT\r\r\nOK\r\n";

const char GPRS_STRING_OK[] = "OK\r\n";

const char GPRS_STRING_GET_MSG[] = "AT+CMGR=";
const char GPRS_STRING_HAVE_MSG[] = "+CMTI:";

const char GPRS_STRING_PREFIX_MSG[] = "+CMGR:";

const char GPRS_STRING_SELECT_TEXT[] = "AT+CMGF=1\r";
const char GPRS_STRING_SELECT_TEXT_RET[] = "AT+CMGF=1\r\r\nOK\r\n";

const char GPRS_STRING_DEL_MSG[] = "AT+CMGD=";

/****************************************************************************
* 名称:void Autofix_Bps(void)
* 功能:波特率自适应,函数设置成功后返回
* 入口参数:无		
* 出口参数:无
****************************************************************************/
void Autofix_Bps(void)
{
	int i;
	char recvbuf[160];
	char buff[160];
	
	for(i = 0; i < 5; i++)
		delay_1s;			//等待5秒
	
	while(1) {
		Uart0_Send_String(GPRS_STRING_AT, sizeof(GPRS_STRING_AT));	//发送握手命令
		gprs_timer = 0;	
		memset(buff, 0, 160);
		while(1) {
			if(Uart0_recv_String(recvbuf, 160) > 0) {
				strcpy(buff, recvbuf);		
				break;
			}
			if(gprs_timer > GPRS_2S)				
				goto cont;	
		}
		gprs_timer = 0;	
		while(1) {
			if(Uart0_recv_String(recvbuf, 160) > 0) {
				strcat(buff, recvbuf);
				if(strcmp(buff, GPRS_STRING_AT_RET) == 0)		//返回应答		
					goto fin;				
			}
			if(gprs_timer > GPRS_2S)	
				goto cont;	
		}
fin:	
		break;		
cont:
		ClearSendDataBuf();		
	}	
	return;
}

/****************************************************************************
* 名称:void GPRS_Set_Text_Mode(void)
* 功能:设置短信模式为TEST模式,设置成功返回
* 入口参数:无		
* 出口参数:无
****************************************************************************/
void GPRS_Set_Text_Mode(void)
{
	char recvbuf[160];
	char buff[160];
	
	while(1) {
		Uart0_Send_String(GPRS_STRING_SELECT_TEXT, strlen(GPRS_STRING_SELECT_TEXT));
		gprs_timer = 0;	
		
		memset(buff, 0, 160);
		while(1) {
			if(Uart0_recv_String(recvbuf, 160) > 0) {
				strcpy(buff, recvbuf);		
				break;
			}
			if(gprs_timer > GPRS_2S)	
				goto cont;	
		}
		gprs_timer = 0;	
		while(1) {
			if(Uart0_recv_String(recvbuf, 160) > 0) {
				strcat(buff, recvbuf);
				if(strcmp(buff, GPRS_STRING_SELECT_TEXT_RET) == 0)		//返回应答		
					goto fin;				
			}
			if(gprs_timer > GPRS_2S)	
				goto cont;	
		}
fin:	
		break;		
cont:
		ClearSendDataBuf();
	}
}


/****************************************************************************
* 名称:uint16 SMSBytes2String(uint8 *pSrc, uint8 *pDst, uint16 nSrcLength)
* 功能:字节数据转换为可打印字符串 {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
* 入口参数:pSrc: 源数据指针 	nSrcLength: 源数据长度
* 出口参数:pDst: 目标字符串指针 返回: 目标字符串长度
****************************************************************************/
uint16 SMSBytes2String(uint8 *pSrc, uint8 *pDst, uint16 nSrcLength)
{
	uint16 i;
	uint8 temptab[18];
	
	strcpy((char *)temptab,(char *)("0123456789ABCDEF"));
	for(i=0;i<nSrcLength;i++)
    	{
    		*pDst++=temptab[*pSrc>>4];	// 输出低4位
	        *pDst++=temptab[*pSrc&0x0f];// 输出高4位
	        pSrc++;
    	}
 
    	*pDst = 0x00;
  	return (uint16)(nSrcLength*2);
}

/****************************************************************************
* 名称:uint16 SMSString2Bytes(uint8* pSrc, uint8* pDst, uint16 nSrcLength)
* 功能:可打印字符串转换为字节数据 "C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
* 入口参数:pSrc:待转化字符串 nSrcLength:字符串长度		
* 出口参数:pDst:存放字节数据数组  返回数组长度
****************************************************************************/
uint16 SMSString2Bytes(uint8 *pSrc, uint8 *pDst, uint16 nSrcLength)
{
	uint16 i;
    	for(i=0; i<nSrcLength; i+=2)
    	{
    	  	
        	// 输出高4位
        	if(*pSrc>='0' && *pSrc<='9')
        	{
            		*pDst = (*pSrc - '0') << 4;
            		
        	}
       	 	else
        	{
            		*pDst = (*pSrc - 'A' + 10) << 4;
        	}

        	pSrc++;

       	 	// 输出低4位
        	if(*pSrc>='0' && *pSrc<='9')
        	{
            		*pDst |= *pSrc - '0';

        	}
        	else
        	{
            		*pDst |= *pSrc - 'A' + 10;
        	}
        	pSrc++;
        	pDst++;
    	}

    	// 返回目标数据长度
    	return nSrcLength / 2;
}

/****************************************************************************
* 名称:int GPRS_Get_Msg_USERID(uint8 userid[16])
* 功能:等待接收短信,若有短信,先接收后删除,并提取短信中的ID
* 入口参数:无		
* 出口参数:无
****************************************************************************/
int GPRS_Get_Msg_USERID(uint8 userid[16])
{
	int i, j,ret = 0;
	char numc[4];
	char recvbuf[160];
	char buff[160];
	char temp[160];
	char *ptr = NULL;
	
	if(Uart0_recv_String(recvbuf, 160) > 0) {
		if(strlen(recvbuf) < 6)
			return 0;
			
		memset(buff, 0, 160);
		strncpy(buff, recvbuf, 6);	
		if(strcmp(buff, GPRS_STRING_HAVE_MSG) != 0)		//有短消息
			return 0;
		
		memset(numc, 0, 4);	
		for(i = 0; i < strlen(recvbuf); i++) {
			if(recvbuf[i] == ',') {
				j = 0;
				while(j < 3) {
					if(recvbuf[i + 1 + j] != '\r')
						numc[j] = recvbuf[i + 1 +j];	//提取短信序号
					else
						break;
					j++;		
				}	
			} 	
		}	
		
		if(numc[0] == 0 && numc[1] == 0 && numc[2] == 0)	//短信序号为0,返回
			return 0;
			
		numc[j] = '\0';
		memset(buff, 0, 160);
		strcpy(buff, GPRS_STRING_GET_MSG);
		strcat(buff, numc);	
		strcat(buff, GPRS_STRING_CR);						//将短信序号附加到读短信命令后
		
		while(1) {	
			Uart0_Send_String(buff, strlen(buff));			//发送读短信命令
			
			gprs_timer = 0;
			memset(temp, 0, 160);
			while(1) {
				if(Uart0_recv_String(recvbuf, 160) > 0) {
					strcat(temp, recvbuf);	
				}
				if(gprs_timer > GPRS_2S)					//2秒内无应答,重新发送读短信命令
						break;		
			}
			
			if(strlen(temp) < 30)			//短信过小,重新读取
				goto cont;
				
			i = 0;	
			ptr = temp;
			do {
				if(*ptr == '\n')
					i++;
				if(i == 2)
					break;
				ptr++;		
			}while(*ptr != '\0');			//定位第二个换行符
			
			if(i != 2) {
				ret = 0;
				goto del;
			}	
			else
				ptr++;	
				
			while(*ptr == ' ') ptr++;
			
			memset(buff, 0, 160);
			for(i = 0;*ptr != '\0'; i++, ptr++) {		//提取用户ID
				if(*ptr == '\r' || *ptr == ' ')
					break;
				else if((*ptr >= '0' && *ptr <= '9') || 
					(*ptr >= 'A' && *ptr <= 'F') || 
					(*ptr >= 'a' && *ptr <= 'f')	)
					buff[i] = *ptr;	
				else {	
					ret = 0;			//非十六进制数,丢弃,并删除当前短信		
					goto del;
				}	
			}
			buff[i] = '\0';
			
			//debug
			for(i = 0; i < strlen(buff); i++) {					//调试用
				if(buff[i] >= 0x30 && buff[i] <= 0x39)			//调试用
					wryw16x8s(i, 1, buff[i] - 0x30);			//调试用
				else if(buff[i] >= 'A' && buff[i] <= 'F') {		//调试用
					temp[0] = buff[i];
					temp[1] = '\0';
					wryw16x8(i,1,temp);							//调试用	
				}	
				else if(buff[i] >= 'a' && buff[i] <= 'f') {		//调试用
					temp[0] = buff[i] - 'a' + 'A';
					temp[1] = '\0';
					wryw16x8(i,1,temp);							//调试用
				}		
			}			
			memset(userid, 0, 16);
			//转化字符ID为数字,比如字符串"12345678" --> 0x12 0x34 0x56 0x78
			ret = (int)SMSString2Bytes((uint8 *)buff, (uint8 *)userid, strlen(buff)); 
			
del:			
			memset(buff, 0, 160);
			strcpy(buff, GPRS_STRING_DEL_MSG);
			strcat(buff, numc);
			strcat(buff, GPRS_STRING_CR);
			Uart0_Send_String(buff, strlen(buff));		//删除已读取短信
					
			return ret;
			
cont:			
			ClearSendDataBuf();
		}
	}
	
	return 0;	
}

/****************************************************************************
* 名称:
* 功能:波特率自适应 设置为TEST模式
* 入口参数:无		
* 出口参数:无
****************************************************************************/
void GPRS_Init(void)
{
	Autofix_Bps();				//波特率自适应
	GPRS_Set_Text_Mode();		//设置为TEST模式
}
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -