1、#include #include #include STC12C5A60S2.h/! 服务器IP地址与端口号,注意,用户需要将此IP替换为/! 自己服务器的公网IP地址#define TCPIP_SERVER_IPADDR 115.171.51.103#define TCPIP_SERVER_PORT 8088/! 串口发送与接收缓冲区大小#define TTY_MAX_BUFFER_SIZE 256/! 串口发送与接收缓冲区char ttyBufferTTY_MAX_BUFFER_SIZE;/! TCPIP发送与接收缓冲区大小#define TCPIP_MAX_BUFFER_SIZE 25
2、6 /! TCPIP发送与接收缓冲区char tcpipBufferTCPIP_MAX_BUFFER_SIZE;/! 串口0初始化函数, 此串口用作接收终端控制命令/! 晶振频率:22.1184MHz/! 串口0波特率:9600void Uart0_Init(void) /9600bps22.1184MHz PCON |= 0x80; /使能波特率倍速位SMOD SCON = 0x50; /8位数据,可变波特率 AUXR |= 0x40; /定时器1时钟为Fosc,即1T AUXR &= 0xfe; /串口1选择定时器1为波特率发生器 TMOD &= 0x0f; /清除定时器1模式位 TMOD
3、 |= 0x20; /设定定时器1为8位自动重装方式 TL1 = 0x70; /设定定时初值 TH1 = 0x70; /设定定时器重装值 ET1 = 0; /禁止定时器1中断 TR1 = 1; /启动定时器1/! 串口0字符串输出函数/! 参数说明:pString为字符串缓冲区首地址void Uart0_PutString(char* pString) unsigned short i = 0; while(pStringi) SBUF = pStringi+; while(!TI); TI = 0; /! 串口0字符串读取函数, 获取一行数据, 遇到换行符为止/! 参数说明:pBuffer为
4、缓冲区首地址, nBufferLen为缓冲区大小, nTimeOut为超时时间/! 如果nTimeOut=0, 那么函数会阻塞, 直到缓冲区满或遇到换行符unsigned short Uart0_GetALine(char* pBuffer, unsigned char nBufferLen, unsigned char nTimeOut) char ch = 0; unsigned int i = 0, j = 0, k = 0; k = 20000*nTimeOut; for(i = 0, j = 0; i nBufferLen; i+) while(1) if(RI) RI = 0; /
5、清除接收完成标志 pBufferi = SBUF; /! 回显给终端显示 SBUF = pBufferi; while(!TI); TI = 0; if(pBufferi = 0x0d) pBufferi = 0x00; return i; break; else if(nTimeOut = 0) continue; else j+; if(j = k) break; return i;/! 串口1初始化函数, 此串口用作控制GSM模块/! 晶振频率:22.1184MHz/! 串口1波特率:9600void Uart1_Init(void) /9600bps22.1184MHz AUXR |=
6、 0x08; /使能波特率倍速位S2SMOD S2CON = 0x50; /8位数据,可变波特率 BRT = 0x70; /设定独立波特率发生器重装值 AUXR |= 0x04; /独立波特率发生器时钟为Fosc,即1T AUXR |= 0x10; /启动独立波特率发生器/! 串口1字符串输出函数/! 参数说明:pString为字符串缓冲区首地址/! 备注:此函数一方面向串口1发送数据,/! 另一方面也向串口0发送数据,/! 目的是为了方便调试void Uart1_PutString(char* pString) unsigned char i = 0; /! 向串口1写数据 i = 0; w
7、hile(pStringi) /! 向串口0写数据,目的是方便调试 SBUF = pStringi; while(!TI); TI = 0; S2BUF = pStringi+; while(!(S2CON&S2TI); S2CON &= S2TI; /* * func Uart1_GetString * author SwanTech (2011/12/14) * param pBuffer 缓冲区地址 * param nBufferLen 缓冲区长度 * param nTimeOut 读取返回数据的超时时间 * return unsigned short 成功: 返回接收到的字节数. 失败
8、: 返回-1 * remark 注意nTimeOut超时时间从接收到第一个字符开始计数 */unsigned short Uart1_GetString(char* pBuffer, unsigned short nBufferLen, unsigned short nTimeOut) unsigned short i = 0, j = 0, k = 0; /! 此函数固定的超时时间,也就是说如果根本就 /! 没有应答数据时,函数经过这个固定超时时间会返回 const unsigned short nFixedTimeout = 65500; for(i = 0; (i nFixedTimeo
9、ut & k = 0); i+) for(j = 0, k = 0; j );/* * brief TCPIP协议栈配置 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_Config(void) /! 下面是配置过程 /! AT Uart1_PutString(ATx0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 60000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:fail
10、ed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:AT Command Exec failed.nr); return -1; /! ATE0 关闭回显 Uart1_PutString(ATE0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Confi
11、g:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:AT Command Exec failed.nr); return -1; /! AT+CIPSHUT 防止上次使用过程中没有关闭网络功能,尝试关闭网络功能 /! 注意,此条命令执行时间较长,大概2秒左右才可以关闭网络功能 /! 所以等待应答的时间较长 Uart1_PutString(AT+CIPSHUTx0D
12、x0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SHUT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:关闭网络功能失败.nr); return -1; /! AT+CIPMUX 设置为单连接模式 U
13、art1_PutString(AT+CIPMUX=0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:设置为单连接模式失败.nr); return -
14、1; /! AT+CIPRXGET 配置为手动获取网络数据 Uart1_PutString(AT+CIPRXGET=1x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPI
15、P_Config:配置为手动获取网络数据失败.nr); return -1; /! AT+CIPQRCLOSE 配置为加速远程断开连接 Uart1_PutString(AT+CIPQRCLOSE=1x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返
16、回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:配置为加速远程断开连接失败.nr); return -1; /! AT+CIPMODE 配置为非透明传输模式 Uart1_PutString(AT+CIPMODE=0x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Config:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer,
17、 OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Config:配置为非透明传输模式失败.nr); return -1; return 0;/* * brief 连接服务器 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_Connect(void) /! AT+CIPSTART 准备连接服务器 sprintf(ttyBuffer, AT+CIPSTART=TCP,%s,%sx0Dx0A, TCPIP_SERVER_IPAD
18、DR, TCPIP_SERVER_PORT); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Connect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Connect:准备连接服
19、务器失败.nr); return -1; /! 判断是否连接已经建立 if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Connect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, CONNECT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Connect:连接服务器失败.nr); r
20、eturn -1; return 0;/* * brief 断开与服务器的连接 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_DisConnect(void) /! AT+CIPCLOSE 断开连接 sprintf(ttyBuffer, AT+CIPCLOSE=1x0Dx0A); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_
21、DisConnect:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, CLOSE OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_DisConnect:断开连接失败.nr); return -1; return 0;/* * brief 关闭网络功能 * author SwanTech (2011/12/12) * param */char SwanTech_TCPIP_NETShut(void) /! AT+CIPSHUT
22、 关闭网络功能 sprintf(ttyBuffer, AT+CIPSHUTx0Dx0A); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_NETShut:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SHUT OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(S
23、wanTech_TCPIP_NETShut:关闭网络功能失败.nr); return -1; return 0;/* * brief SIM900_TCPIP数据发送函数 * author SwanTech (2011/12/12) * param pBuffer: 数据缓冲区地址 * param nBufferLen: 数据长度 */short SwanTech_TCPIP_Send(char* pBuffer, unsigned short nBufferLen) /! 请求发送数据 /! AT+CIPSEND sprintf(ttyBuffer, AT+CIPSEND=%dx0Dx0A,
24、 nBufferLen); Uart1_PutString(ttyBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Send:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, ) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Send:请求发送数据失败.nr); return -1
25、; /! 发送数据 Uart1_PutString(pBuffer); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 1000) = 0) Uart0_PutString(SwanTech_TCPIP_Send:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, SEND OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Send:发送数据失败.nr); return -1;
26、 return nBufferLen;/* * brief SIM900_TCPIP数据接收函数 * author SwanTech (2011/12/12) * param pBuffer: 数据缓冲区地址 * param nBufferLen: 缓冲区大小 */short SwanTech_TCPIP_Recv(char* pBuffer, unsigned short nBufferLen) /! 判断应答数据到来标志+CIPRXGET:1 if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZE, 10000) = 0) Uart0_PutSt
27、ring(SwanTech_TCPIP_Recv:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, +CIPRXGET:1) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Recv:获取应答数据标志失败.nr); return -1; /! 读取应答数据 Uart1_PutString(AT+CIPRXGET=2,128x0Dx0A); if(Uart1_GetString(ttyBuffer, TTY_MAX_BUFFER_SIZ
28、E, 30000) = 0) Uart0_PutString(SwanTech_TCPIP_Recv:Uart1_GetString:failed.nr); return -1; if(strstr(ttyBuffer, OK) = NULL) /! 没有找到命令成功执行的结果,函数返回,否则命令执行成功 Uart0_PutString(SwanTech_TCPIP_Recv:读取应答数据失败.nr); return -1; return 1;void SwanTech_CommandMonitor(void) unsigned char bFinishConfig = 0; unsigned
29、 char bFinishConnect = 0; char buffer3 = 0; while(1) Uart0_GetALine(buffer, 2, 0); /! 如果连续收到2个0x7F,那么认为是STC-ISP正在请求下载程序 /! 这时候启动系统复位,从ISP监控程序重新引导 if(buffer0 = 0x7F & buffer1 = 0x7F) IAP_CONTR = 0x60; Uart0_PutString(nr+-+nr); if(buffer0 = 1) if(SwanTech_TCPIP_Config() = -1) bFinishConfig = 0; /! 配置失
30、败的标志 Uart0_PutString(nr+开启TCPIP网络功能失败!nr); else bFinishConfig = 1; /! 配置成功的标志 Uart0_PutString(nr+开启TCPIP网络功能成功!nr); else if(buffer0 = 2) if(bFinishConfig = 0) /! 如果没有开启TCPIP网络功能,那么返回失败 Uart0_PutString(nr+请先开启TCPIP网络功能!nr); else if(SwanTech_TCPIP_Connect() = -1) bFinishConnect = 0; /! 连接失败的标志 Uart0_P
31、utString(nr+连接服务器失败!nr); else bFinishConnect = 1; /! 连接成功的标志 Uart0_PutString(nr+连接服务器成功!nr); else if(buffer0 = 3) strcpy(tcpipBuffer, 鸿鹄电子科技. Http:/ if(bFinishConnect = 0) /! 如果成功连接到服务器,那么返回失败 Uart0_PutString(nr+请先连接服务器!nr); else if(SwanTech_TCPIP_Send(tcpipBuffer, strlen(tcpipBuffer) = -1) Uart0_Pu
32、tString(nr+发送数据失败!nr); else Uart0_PutString(nr+发送数据成功!nr); else if(buffer0 = 4) strcpy(tcpipBuffer, 鸿鹄电子科技. Http:/ if(bFinishConnect = 0) /! 如果成功连接到服务器,那么返回失败 Uart0_PutString(nr+请先连接服务器!nr); else if(SwanTech_TCPIP_Send(tcpipBuffer, strlen(tcpipBuffer) = -1) Uart0_PutString(nr+发送数据失败!nr); else Uart0_
33、PutString(nr+发送数据成功!nr); Uart0_PutString(nr+等待服务器应答.nr); if(SwanTech_TCPIP_Recv(tcpipBuffer, TCPIP_MAX_BUFFER_SIZE) = -1) Uart0_PutString(nr+接收应答数据失败!nr); else Uart0_PutString(nr+接收应答数据成功!nr); else if(buffer0 = 5) if(bFinishConnect = 0) Uart0_PutString(nr+连接还没有建立,请先建立与服务器之间的连接!nr); else if(SwanTech_
34、TCPIP_DisConnect() = -1) Uart0_PutString(nr+断开与服务器之间的连接失败!nr); else Uart0_PutString(nr+断开与服务器之间的连接成功!nr); else if(buffer0 = 6) if(SwanTech_TCPIP_NETShut() = -1) Uart0_PutString(nr+关闭TCPIP网络功能失败!nr); else Uart0_PutString(nr+关闭TCPIP网络功能成功!nr); SwanTech_CommandDisplay(); void main(void) Uart0_Init(); Uart1_Init(); while(1) if(RI) RI = 0; SwanTech_LogoDisplay(); SwanTech_CommandDisplay(); break; while(1) SwanTech_CommandMonitor();