📄 gtm900.c
字号:
#include"MyIncludes.h"
extern PNode pOSListCtrl;/*控件用的链表指针。该链表动态创建,FILO方式*/
//const int8u *StrOK=(int8u*)"OK";
//const int8u *StrERROR=(int8u*)"ERROR";
#if M_GPRS>0
OS_EVENT *GPRSSem;/*GPRS是否有空的信号量*/
int32u GTM900Init(void)
{
int32u x;
int8u buf[60];
GPRSSem = OSSemCreate(1);
for(x=3;x!=0;x--)
{//检查串口是否工作正常
if(GTM900Cmd((int8u*)"AT",1000)!=0)break;
OSTimeDly(1000);
}
if(x==0)return 0;
ClearBuf(buf,60);
for(x=3;x!=0;x--)
{//检查SIM卡是否工作正常
if(GTM900Cmd3((int8u*)"AT+CPIN?","READY",2000)!=0)break;
OSTimeDly(1000);
}
if(x==0)return 0;
return 1;
}
int32u TCPIPConnect(void)
{//还需要判断读出的数据是否正确
int32u x;
int8u buf[40];
for(x=3;x!=0;x--)
{//先断开
if(GTM900Cmd((int8u*)"AT%IPCLOSE=5",15000)!=0)break;
OSTimeDly(1500);
}
if(x==0)goto exit;
ClearBuf(buf,40);
strcat((char*)buf,"AT+CGDCONT=1,\"IP\",\"");
if(ReadGPRSInterPoint(buf+19,10)==0)goto exit;
strcat((char*)buf,"\"");
for(x=3;x!=0;x--)
{
if(GTM900Cmd(buf,15000)!=0)break;
OSTimeDly(1500);
}
if(x==0)goto exit;
for(x=3;x!=0;x--)
{
//连
if(GTM900Cmd((int8u*)"AT%ETCPIP=\"USER\",\"GPRS\"",30000)!=0)break;
OSTimeDly(1500);
}
if(x==0)goto exit;
ClearBuf(buf,40);
strcat((char*)buf,"AT%IPOPEN=");
if(ReadGPRSTCPIP(buf+10,29)==0)goto exit;
for(x=3;x!=0;x--)
{
if(GTM900Cmd3(buf,"CONNECT",15000)!=0)break;
OSTimeDly(1500);
}
if(x==0)goto exit;
for(x=5;x!=0;x--)
{//设置缓冲区可以用
if(GTM900Cmd((int8u*)"AT%IOMODE=1,1,0",5000)!=0)break;
OSTimeDly(1000);
}
if(x==0)goto exit;
/* for(x=5;x!=0;x--)
{//设置手工删除缓冲区数据
if(GTM900Cmd((int8u*)"AT%IPDDMODE=1",5000)!=0)break;
OSTimeDly(1000);
}*/
return 1;
exit:
GTM900Cmd((int8u*)"AT%IPCLOSE=5",5000);
return 0;
}
int32u GTM900Cmd(int8u *cmd,int16u timeout)
{//返回值 1 OK 0 ERROR
int8u err;
int32u flag;
POSMSG pMsg;
OSSemPend(GPRSSem,timeout,&err);
if(err==OS_TIMEOUT)return 0;
OSSemPend(Uart1Sem,0,&err);
//OSTimeDly(50);
UartRevBufClear(1);///////////////////////////
for(;;)///////////////////////////////////////
{/////////////////////////////////////////////
pMsg=OSWaitAppMsg(OSM_UART_REV,1,0);//////
flag=pMsg->wparam;////////////////////////
free(pMsg);///////////////////////////////
UartRevBufClear(1);
if(flag==0)break;/////////////////////////
}/////////////////////////////////////////////
UartPrint(1,cmd,strlen((char*)cmd));
UartPrint(1,(int8u*)"\r",1);
flag=UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",timeout);
OSSemPost(Uart1Sem);
OSSemPost(GPRSSem);
if(flag==1)return 1;
return 0;
}
int32u GTM900Cmd2(int8u *cmd,int8u *return_buf,int32u len,int16u timeout)
{
int8u err;
int32u flag;
POSMSG pMsg;
OSSemPend(GPRSSem,timeout,&err);
//if(err!=OS_NO_ERR)return 0;
if(err==OS_TIMEOUT)return 0;
//OSSemPend(Uart1Sem,0,&err);
//OSTimeDly(50);
UartRevBufClear(1);///////////////////////////
for(;;)///////////////////////////////////////
{/////////////////////////////////////////////
pMsg=OSWaitAppMsg(OSM_UART_REV,1,0);//////
flag=pMsg->wparam;////////////////////////
free(pMsg);///////////////////////////////
UartRevBufClear(1);
if(flag==0)break;/////////////////////////
}/////////////////////////////////////////////
//UartRevBufClear(1);
UartPrintStr(1,cmd,strlen((char*)cmd),0);
UartPrintStr(1,(int8u*)"\r",1,0);
flag=UartRevData(1,return_buf,len,timeout);
//OSSemPost(Uart1Sem);
OSSemPost(GPRSSem);
if(flag==1)return 1;
return 0;
}
int32u GTM900Cmd3(int8u *cmd,char *result,int16u timeout)
{//如果接收到字符串 result 则返回1,否则返回0
int8u err;
int32u flag;
int8u buf[40];
POSMSG pMsg;
ClearBuf(buf,40);
OSSemPend(GPRSSem,timeout,&err);
//if(err!=OS_NO_ERR)return 0;
if(err==OS_TIMEOUT)return 0;
//OSTimeDly(50);
OSSemPend(Uart1Sem,0,&err);
UartRevBufClear(1);///////////////////////////
for(;;)///////////////////////////////////////
{/////////////////////////////////////////////
pMsg=OSWaitAppMsg(OSM_UART_REV,1,0);//////
flag=pMsg->wparam;////////////////////////
free(pMsg);///////////////////////////////
UartRevBufClear(1);
if(flag==0)break;/////////////////////////
}/////////////////////////////////////////////
UartPrint(1,cmd,strlen((char*)cmd));
UartPrint(1,(int8u*)"\r",1);
flag=UartIsRevStrs(1,(int8u*)result,(int8u*)"ERROR",timeout);
OSSemPost(Uart1Sem);
OSSemPost(GPRSSem);
if(flag==1)return 1;
return 0;
}
int32u GTM900IPOpen(int8u *addr,int8u *port,int32u mode)
{//mode==0 TCP mode==1 UDP
OSTimeDlyHMSM(0,0,0,10);
UartRevBufClear(1);
UartPrint(1,(int8u*)"AT+CGDCONT=1,\"IP\",\"CMNET\"\r",strlen("AT+CGDCONT=1,\"IP\",\"CMNET\"\r"));//定义PDP 上下文
if(UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",15000)!=1)goto exit;
OSTimeDlyHMSM(0,0,0,10);
UartRevBufClear(1);
UartPrint(1,(int8u*)"AT%ETCPIP=\"USER\",\"GPRS\"\r",strlen("AT%ETCPIP=\"USER\",\"GPRS\"\r"));//进入tcpip功能
if(UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",30000)!=1)goto exit;
OSTimeDlyHMSM(0,0,0,10);
UartRevBufClear(1);
if(mode==0)UartPrint(1,(int8u*)"AT%IPOPEN=\"TCP\",\"",strlen("AT%IPOPEN=\"TCP\",\""));//打开一条tcp链接
if(mode==1)UartPrint(1,(int8u*)"AT%IPOPEN=\"UDP\",\"",strlen("AT%IPOPEN=\"UDP\",\""));
UartPrint(1,(int8u*)addr,strlen((char*)addr));
UartPrint(1,(int8u*)"\",",2);
UartPrint(1,(int8u*)port,strlen((char*)port));
UartPrint(1,(int8u*)"\r",1);
if(UartIsRevStrs(1,(int8u*)"CONNECT",(int8u*)"ERROR",15000)!=1)goto exit;
OSTimeDlyHMSM(0,0,0,10);
UartRevBufClear(1);
UartPrint(1,(int8u*)"AT%IOMODE=1,1,0\r",16);//设置缓冲区可以用
if(UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",5000)!=1)goto exit;
OSTimeDlyHMSM(0,0,0,10);
UartRevBufClear(1);
UartPrint(1,(int8u*)"AT%IPDDMODE=1\r",14);//设置手工删除缓冲区数据
if(UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",5000)==1)return 1;
exit:
UartPrint(1,(int8u*)"AT%IPCLOSE=5\r",13);
UartIsRevStrs(1,(int8u*)"OK",(int8u*)"ERROR",5000);
return 0;
}
/*
********************************************************************************
** 函数名称: SetGTM900Baud
** 功能描述: 设置GTM900的波特率
** 输 入: baud 波特率的代号
0 9600
1 19200
2 28800
** 输 出: 创建了的消息
** 备 注: 没有
********************************************************************************
*/
int32u SetGTM900Baud(int32u baud)
{
int8u buf[6];
int8u err;
ClearBuf(buf,6);
itostr(baud,buf);
OSSemPend(Uart1Sem, 0, &err);
UartPrint(1,(int8u*)"AT+IPR=",7);
UartPrint(1,buf,strlen((char*)buf));
UartPrint(1,(int8u*)"\r",1);
if(UartIsRevStr(1,(int8u*)"OK",2000)==1)
{
OSSemPostBin(Uart1Sem);
return 1;
}
else
{
OSSemPostBin(Uart1Sem);
return 0;
}
}
int32u GTM900GPRSSendData(int8u *data,int32u len,int16u timeout)
{
int8u *buf;
int32u index;
int32u lenth;
if(len==0)return 0;//////
OS_ENTER_CRITICAL();//////////////
buf=(int8u*)malloc(len*2+16);
OS_EXIT_CRITICAL();///////////////
if(buf==NULL)return 0;
ClearBuf(buf,len*2+16);
OSTimeDly(20);///////////////////////////////
strcat((char*)buf,"AT%IPSEND=\"");
lenth=hex_2_ascii(data,buf+11,len);
strcat((char*)buf,"\"");
index=GTM900Cmd(buf,15000);
free(buf);
return index;
}
int32u isCMD_CFG(int8u *data)
{
int8u Buf[32];
int8u *str;
int32u x;
if((FineStr(data,(int8u*)"CFG=")!=NULL)&&(FineStr(str,(int8u*)"\r\nOK")!=NULL))
{
for(x=5;x!=0;x--)
{
if(FineStr(data,(int8u*)"\r\n")==NULL)break;
}
if(x!=0)return 0;
for(x=4;x!=0;x--)
{
if(FineStr(data,(int8u*)"\"")==NULL)break;
}
if(x!=0)return 0;
for(x=8;x!=0;x--)
{
if(FineStr(data,(int8u*)",")==NULL)break;
}
if(x!=0)return 0;
//串口信息
ClearBuf(Buf,32);
GetStrBetweenStrs(data,Buf,(int8u*)"CFG=",(int8u*)"\r\n");
if(SetGPRSTUart(Buf,15)==0)return 0;
//网络信息
str=FineStr(data,(int8u*)"\r");
ClearBuf(Buf,32);
GetStrBetweenStrs(str,Buf,(int8u*)"\n",(int8u*)"\r\n");
if(SetGPRSTCPIP(Buf,30)==0)return 0;
//接入点
str=FineStr(str,(int8u*)"\r");
ClearBuf(Buf,32);
GetStrBetweenStrs(str,Buf,(int8u*)"\n",(int8u*)"\r\n");
if(SetGPRSInterPoint(Buf,12)==0)return 0;
//心跳时间
str=FineStr(str,(int8u*)"\r");
ClearBuf(Buf,32);
GetStrBetweenStrs(str,Buf,(int8u*)"\n",(int8u*)"\r\n");
if(SetGPRSTick(Buf,12)==0)return 0;
//心跳内容
str=FineStr(str,(int8u*)"\r");
ClearBuf(Buf,32);
GetStrBetweenStrs(str,Buf,(int8u*)"\n",(int8u*)"\r\n");
if(SetGPRSTickTxt(Buf,12)==0)return 0;
UartPrintStr(0,(int8u*)"\r\nOK",4,0);
return 1;
}
return 0;
}
int32u isCMD_Query(int8u *str)
{
int8u buf[100];
int32u len;
//if(FineStr(str,(int8u*)"GPRS_QUERY")!=NULL)
if(strcmp((char*)str,"GPRS_QUERY\r\n")==0)
{
ClearBuf(buf,100);
strcat((char*)buf,"CFG=");//报头
ReadGPRSTUart(buf+4,12);//串口信息
strcat((char*)buf,"\r\n");
len=strlen((char*)buf);
ReadGPRSTCPIP(buf+len,30);//网络信息
strcat((char*)buf,"\r\n");
len=strlen((char*)buf);
ReadGPRSInterPoint(buf+len,10);//接入点
strcat((char*)buf,"\r\n");
len=strlen((char*)buf);
ReadGPRSTick(buf+len,10);//心跳时间
strcat((char*)buf,"\r\n");
len=strlen((char*)buf);
ReadGPRSTickTxt(buf+len,10);//心跳内容
strcat((char*)buf,"\r\nOK");//报尾
len=strlen((char*)buf);
UartPrintStr(0,buf,len,0);
return 1;
}
return 0;
}
void ReSetCfgData(int8u *tickTxt,int32u *tickTime)
{
int8u buf[12];
int8u buf2[8];
ClearBuf(buf,12);
ClearBuf(buf2,8);
ReadGPRSTUart(buf,12);
GetStrBefour(buf,buf2,(int8u*)",");
UartSetBaud(0,strtoi(buf2));
//心跳时间
ClearBuf(buf,12);
ReadGPRSTick(buf,12);
(*tickTime)=strtoi(buf);
//心跳内容
ClearBuf(tickTxt,12);
ReadGPRSTickTxt(tickTxt,10);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -