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

📄 gtm900.c

📁 这是一个控制华为GPRS模块GTM900B的驱动程序
💻 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 + -