📄 gprs.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 + -