📄 main.c
字号:
#include "config.h"
#include "stdio.h"
#define MAX_RS232_BUF 512 //串口接收缓存区
#define UART_BPS 9600
const char Hold_String[]={"Intek"};
extern void DelayNS(uint32 dly);
extern void UART1_Exception(void);
extern uint8 ModemCommand(char *Command);
extern uint8 RecBuff[1024];
extern volatile uint16 RecPointer;
extern volatile uint16 ReadPointer;
volatile uint8 WareRevPointer;
const uint8 ServerIP1[]={218,56,226,241};
const uint8 ServerIP2[]={218,56,226,241};
const uint16 Port1=1010;
const uint16 Port2=0x1010;
uint8 WareRevbuf[MAX_RS232_BUF];
uint8 PPP_Process(void);
void __irq IRQ_UART0(void)
{
uint8 temp;
temp=U0IIR;
if( 0x04==(temp&0x0F) )
{
WareRevbuf[WareRevPointer]=U0RBR;
WareRevPointer++;
if(WareRevPointer>=MAX_RS232_BUF)
WareRevPointer=0;
}
VICVectAddr = 0x00; // 中断处理结束
}
void UART0_SendString(uint8 *str)
{
while(*str)
{
U0THR=*str;
while( (U0LSR&0x40)==0 );
str++;
}
}
void UART0_SendDataLen(uint8 *buf,uint8 length)
{
uint8 i;
i=0;
while(i<length)
{
U0THR=buf[i];
while( (U0LSR&0x40)==0 );
i++;
}
}
void UART0_Init(void)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0&0xFFFFFFF0)|0x05; // 设置I/O连接到UART0
IO1DIR = (IO1DIR&0xFCFFFFFF)|0x03000000;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
U0IER = 0x03;
VICVectCntl3 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr3 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable |= 0x00000040; // 使能UART0中断
}
uint8 Check_SIMCard(void)
{
uint8 status;
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CCID\r",8); //检测是否装有SIM 卡
if(status!=MODEM_CONNECT)
{
while(1)
{
UART0_SendString((uint8 *)"执行命令错误\r\n");
DelayNS(10);
}
}
DelayNS(1);
if(ReadPointer<RecPointer)
{
//测试没插入SIM卡的返回值、插入SIM卡返回卡ID号
if((RecBuff[RecPointer-1]==13)&&(RecBuff[RecPointer-2]=='0'))
{
//打印SIM_ID
UART0_SendDataLen(&RecBuff[8],RecPointer-13);
RecPointer=ReadPointer=0;
return 0;
}
else
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
}
else
{
//while(1)
//{
//UART0_SendString((uint8 *)"GPRS无应答或设备不存在\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
}
uint8 Start_GPRS(void)
{
uint8 status;
status=ModemInit(115200);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
// UART0_SendString((uint8 *)"GPRS不存在\r\n");
// DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemCommand("AT\r");
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 2;
}
RecPointer=ReadPointer=0;
return 0;
}
uint8 Check_CSQ(void)
{
uint8 status;
uint8 count=0;
CSQ:
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CSQ\r",7);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
DelayNS(1);
while(ReadPointer<RecPointer)
{
//返回10-31、0继续,如返回99,99;则信号太差、使用“A/”命令不停的搜寻网络
//返回的第一个表示信号强度:最大应为30,一般为28左右、第二个表示:误码率为0
//正确返回的长度应该是13,+CSQ:XX,0\r\n0\r
if(!(RecBuff[RecPointer-1]==13&&RecBuff[RecPointer-2]=='0'))
{
//UART0_SendString((uint8 *)"无信号\r\n");
if(count>10)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
DelayNS(10);
goto CSQ;
}
if(RecBuff[7]==',')
{
//UART0_SendString((uint8 *)"信号太弱\r\n");
if(count>10)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
DelayNS(10);
goto CSQ;
}
else
{
if(RecBuff[6]=='9'&&RecBuff[7]=='9')
{
//UART0_SendString((uint8 *)"无信号\r\n");
if(count>10)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
DelayNS(10);
goto CSQ;
}
}
break;
}
if(RecPointer==0)
{
//信号检测失败
if(count>10)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
goto CSQ;
}
else
{
//信号检测成功
RecPointer=ReadPointer=0;
return 0;
}
RecPointer=ReadPointer=0;
return 0;
}
uint8 Reset_GPRS(void)
{
uint8 status;
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CFUN=0\r",10); //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
do{
DelayNS(10);
}while(RecPointer>0);
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CFUN=1\r",10); //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
//do{
//DelayNS(10);
//}while(RecPointer>0);
DelayNS(100);
return 0;
}
uint8 Config_GPRS(void)
{
uint8 status;
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemCommand("AT+CGCLASS=\"B\"\r"); //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
RecPointer=ReadPointer=0; //清除接受缓存区
//超级终端测试、返回值处理
status=ModemCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r"); //设置 1:表示使用第一种配置方案、IP:表示协议、CMNET:APN;GSM7.07标准
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
CGATT_AGAIN:
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CGATT=1\r",11);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
CGATT_WAIT:
DelayNS(20);
while(ReadPointer<RecPointer)
{
if(RecPointer==2)
{
if(RecBuff[0]!='0'||RecBuff[1]!=0x0D)
{
goto CGATT_AGAIN;
}
else
{
break;
}
}
}
if(RecPointer==0)
{
goto CGATT_WAIT;
}
//status=ModemCommand("AT+CGATT=1\r");
//if(status!=MODEM_CONNECT)
//{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
//RecPointer=ReadPointer=0;
//return 1;
//}
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT+CGATT?\r",10);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
DelayNS(5);
while(ReadPointer<RecPointer)
{
if(RecBuff[ReadPointer]=='+')
{
status=memcmp(&RecBuff[ReadPointer],"+CGATT: 1\r\n",11);
if(status!=0)
{
goto CGATT_AGAIN;
}
else
{
RecPointer=ReadPointer=0;
return 0;
}
}
ReadPointer++;
}
if(RecPointer==0)
goto CGATT_AGAIN;
else if(ReadPointer==RecPointer)
goto CGATT_AGAIN;
RecPointer=ReadPointer=0;
return 0;
}
uint8 Stop_TCP(void)
{
uint8 status;
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT#CONNECTIONSTOP\r",18);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
status=0;
CONNECTIONSTOP_WAIT:
do{
if(status>4)
break;
if(status>20)
return 1;
status++;
DelayNS(10);
}while(RecPointer==0);
if(RecPointer==2)
{
if(RecBuff[0]=='0'&&RecBuff[1]==0x0D)
{
return 0;
}
else
goto CONNECTIONSTOP_WAIT;
}
return 0;
}
uint8 Start_TCP(void)
{
uint8 status;
uint8 demc=0;
uint8 count=0;
char tempch[30];
CONNECTIONSTART:
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemWrite("AT#CONNECTIONSTART\r",19);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
WAIT:
status=0;
do{
if(status>4)
break;
status++;
DelayNS(10);
}while(RecPointer<0x12);
while(ReadPointer<RecPointer)
{
if(RecBuff[ReadPointer]=='.')
{
demc++;
}
ReadPointer++;
}
if(demc==3)
{
if(RecBuff[RecPointer-3]!='6'||RecBuff[RecPointer-4]!='8'||RecBuff[RecPointer-5]!='0'||RecBuff[RecPointer-6]!='3') //3086
{
if(count>12)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
if(count%4==0)
goto CONNECTIONSTART;
else
goto WAIT;
}
/*if(RecBuff[RecPointer-2]!=0x0D||RecBuff[RecPointer-1]!=0x0A)
{
if(count>12)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
if(count%4==0)
goto CONNECTIONSTART;
else
goto WAIT;
}*/
/*if(RecBuff[RecPointer-7]!=0x0A||RecBuff[RecPointer-8]!=0x0D)
{
if(count>12)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
if(count%4==0)
goto CONNECTIONSTART;
else
goto WAIT;
}*/
//获取移动分配的IP
}
else
{
if(demc==0)
{
status=memcmp(RecBuff,"#CME ERROR: 35840\r\n",0x13);
if(status==0)
{
Stop_TCP();
goto CONNECTIONSTART;
}
}
if(count>12)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
if(count%4==0)
goto CONNECTIONSTART;
else
goto WAIT;
}
if(RecPointer==0)
{
if(count>12)
{
RecPointer=ReadPointer=0;
return 1;
}
count++;
if(count%4==0)
goto CONNECTIONSTART;
else
goto WAIT;
//goto WAIT;
}
else
{
//检测成功
RecPointer=ReadPointer=0;
}
sprintf(tempch,"AT#TCPSERV=1,\"%d.%d.%d.%d\"\r",ServerIP1[0],ServerIP1[1],ServerIP1[2],ServerIP1[3]);
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemCommand(tempch);
if(status!=MODEM_CONNECT)
{
//while(1)
//{
//UART0_SendString((uint8 *)"执行命令错误\r\n");
//DelayNS(10);
//}
RecPointer=ReadPointer=0;
return 1;
}
sprintf(tempch,"AT#TCPPORT=1,\"%d\"\r",Port1);
RecPointer=ReadPointer=0; //清除接受缓存区
status=ModemCommand(tempch);
if(status!=MODEM_CONNECT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -