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

📄 term.c

📁 GPRS打电话
💻 C
字号:
/* * ===================================================================================== * *       Filename:  termios.c * *    Description:   * *        Version:  1.0 *        Created:  2008年11月11日 12时33分12秒 *       Revision:  none *       Compiler:  gcc * *         Author:  Dr. Fritz Mehner (mn), mehner@fh-swf.de *        Company:  FH Südwestfalen, Iserlohn * * ===================================================================================== */#include<stdarg.h>#include<sys/types.h>#include"sem.h"#include"term.h"#include"command.h"#include"option.h"#include"wave.h"static int ATComUntilStr(int fd,const char *strATCommand,const char *strPrompt,char *strResult,int nATReadTimes);static char *getline(char *message);static void analysis(int fd,char *message);static int openTerm(int fd,struct termios *pNewtio,struct termios *pOldtio,int uBaudRate);static void closeTerm(int fd);static void setTermios(struct termios *pNewtio,int uBaudRate);void gprsd_debug( const char *file,int line,const char *fmt, ...){	va_list ap;	if(!gprs_debug_on)		return;	fprintf(stderr,"(%s:%d:%d)",file,line,getpid());	va_start(ap,fmt);	vfprintf(stderr,fmt,ap);	va_end(ap);}/* *函数名:openTerm() *功能:  打开串口 *参数:  int *fd:串口设备文件描述符  *返回值: */static int openTerm(int fd,struct termios *pNewtio,struct termios *pOldtio,int uBaudRate){	semaphore_p(gprsid);	if((fd=open(GPRSTTY,O_RDWR | O_NOCTTY))<0)	{		fprintf(stderr,"Can't Open Serial Port!GPRSTTY\n");		exit(0);	}	else	{		tcgetattr(fd,pOldtio);		setTermios(pNewtio,uBaudRate);		tcflush(fd,TCIFLUSH);		tcsetattr(fd,TCSANOW,pNewtio);		GPRSD_DEBUG("Open Serial Port!GPRSTTY\n",NULL);		return fd;	}}static void closeTerm(int fd){		sleep(2);		tcflush(fd,TCIFLUSH);		tcsetattr(fd,TCSANOW,&oldtio);		close(fd);		semaphore_v(gprsid);		GPRSD_DEBUG("Close serial ok!\n",NULL);}static void setTermios(struct termios *pNewtio,int uBaudRate){  bzero (pNewtio, sizeof (struct termios));	/* clear struct for new portsettings */  pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;  pNewtio->c_iflag = IGNPAR;  pNewtio->c_oflag = 0;  pNewtio->c_lflag = 0;		//non ICANON  /*     initialize all control characters     we don't need them here   */  pNewtio->c_cc[VINTR]    = 0;   /* Ctrl-c */  pNewtio->c_cc[VQUIT]    = 0;   /* Ctrl-\ */  pNewtio->c_cc[VERASE]   = 0;    /* del */  pNewtio->c_cc[VKILL]    = 0;   /* @ */  pNewtio->c_cc[VEOF]     = 4;   /* Ctrl-d */  pNewtio->c_cc[VTIME]    = 5;   /* inter-character timer, timeout VTIME*0.1 */  pNewtio->c_cc[VMIN]     = 0;   /* blocking read until VMIN character arrives */  pNewtio->c_cc[VSWTC]    = 0;   /* '\0' */  pNewtio->c_cc[VSTART]   = 0;    /* Ctrl-q */  pNewtio->c_cc[VSTOP]    = 0;   /* Ctrl-s */  pNewtio->c_cc[VSUSP]    = 0;   /* Ctrl-z */  pNewtio->c_cc[VEOL]     = 0;   /* '\0' */  pNewtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */  pNewtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */  pNewtio->c_cc[VWERASE] = 0;     /* Ctrl-w */  pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v */  pNewtio->c_cc[VEOL2]  = 0; /* '\0' */  GPRSD_DEBUG("serial port set ok!\n",NULL);}static int readTerm(int fd,char *buf){	int nRes,ch,nTotal;	char strAT[BUFSIZE];	char strResult[BUFSIZE];	nTotal=0;	nRes=0;	ch=0;	while(1)	{				nRes=read(fd,strAT,BUFSIZE-nTotal);		if(nRes>0)		{			strAT[nRes]='\0';			memcpy(strResult+nTotal,strAT,nRes);			nTotal+=nRes;			ch=0;		}		else		{			if(ch++==3)				break;		}		if(strstr(strResult,buf)!=NULL)		{			return 1;		}	}	strResult[nTotal]='\0';	//check if OK	return 0;}/* *函数名:sendSMS() *功能:  短信发送过程 *参数:  fd:串口设备描述符 phNumber:短信接收方手机号码 message:短信内容 *返回值: */int sendSMS(int fd,const char *phNumber, const char *message){	char strATResult[BUFSIZE];	char strAT[BUFSIZE];	int total;	fd=openTerm(fd,&newtio,&oldtio,115200);	total=0;	sprintf(strAT,"at+cmgf=1%c%c",0x0d,0x0a);//文本模式。AT+CMGF=1回车符+换行符	while(!ATComUntilStr (fd, strAT, "OK", strATResult, ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			GPRSD_DEBUG("set at+cmgf=1 failed!\n",NULL);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGF=1 OK!\n",NULL);	total=0;		//send message    sprintf(strAT,"at+cmgs=\"%s\"%c%c",phNumber,0x0d,0x0a);	while(!ATComUntilStr(fd,strAT,">",strATResult,ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			GPRSD_DEBUG("set at+cmgs=\"%s\" failed!\n",phNumber);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGS=%s OK!\n",phNumber);	total=0;	sprintf (strAT, "%s%c",message, 0x1a);	while (!ATComUntilStr (fd, strAT, "OK", strATResult, ATREADTIMES * 3))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			GPRSD_DEBUG("send message:%s failed!!\n",strAT);			return 0;		}	}	GPRSD_DEBUG("sendSMSEND\n",NULL);	closeTerm(fd);	return 1;}/* *函数名:receSMS() *功能:  短信接收函数,将卡中未读的短信读出并保存到文件中 *参数:  fd:串口设备描述符 *返回值: */int receSMS(int fd){	int total=0;	char strATResult[BUFSIZE];	char strAT[BUFSIZE];	fd=openTerm(fd,&newtio,&oldtio,115200);	tcflush(fd,TCIFLUSH);	GPRSD_DEBUG("set at+cmgf=1\n",NULL);	sprintf(strAT,"at+cmgf=1%c%c",0x0d,0x0a);//文本模式。AT+CMGF=1回车符+换行符	while(!ATComUntilStr(fd,strAT,"OK",strATResult,ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{				GPRSD_DEBUG("Set at+cmgf=1 failed\n",NULL);			closeTerm(fd);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGF=1 OK!\n",NULL);	sprintf(strAT,"at+cmgl=\"REC UNREAD\"%c%c",0x0d,0x0a);//AT+CMGL=REC UNREAD回车符+换行符	total=0;	while(!ATComUntilStr( fd,strAT,"OK",strATResult,ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGL=1 OK!\n",NULL);	if(strstr(strATResult,"CMGL"))	{		GPRSD_DEBUG("Have a unread message %s\n",strATResult);		closeTerm(fd);		analysis(fd,strATResult);		return 1;	}	fprintf(stderr,"There is no unread message !\n");	closeTerm(fd);	return 0;}/* *函数名:readSMS() *功能:  读取卡中序号为number的短信的内容 *参数:  fd:串口设备描述符 *返回值: */int readSMS(int fd,int number){	int total=0;	char strATResult[BUFSIZE];	char strAT[BUFSIZE];	fd=openTerm(fd,&newtio,&oldtio,115200);	tcflush(fd,TCIFLUSH);	sprintf(strAT,"at+cmgf=1%c%c",0x0d,0x0a);	while(!ATComUntilStr(fd,strAT,"OK",strATResult,ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGF=1 OK!\n",NULL);	sprintf(strAT,"at+cmgr=%d%c%c",number,0x0d,0x0a);	total=0;	while(!ATComUntilStr( fd,strAT,"OK",strATResult,ATREADTIMES))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			return 0;		}	}	GPRSD_DEBUG("set AT+CMGR=1 OK!\n",NULL);	closeTerm(fd);	analysis(fd,strATResult);	return 1;}/* *函数名:ATComUntilStr() *功能:  读取串口,并根据读取的内容与预期的内容对比。 *参数:  fd:串口设备描述符 *		  strATCommand: 命令	strPrompt: 预期的输出结果	strResult: 读取到的内容	nATReadTimes:	尝试的次数 *返回值: */static int ATComUntilStr(int fd,const char *strATCommand,const char *strPrompt,char *strResult,int nATReadTimes){	int nRes,ch,nTotal;	char strAT[BUFSIZE];	write(fd,strATCommand,strlen(strATCommand));	nTotal=0;	nRes=0;	ch=0;	while(1)	{				nRes=read(fd,strAT,BUFSIZE-nTotal);		if(nRes>0)		{			strAT[nRes]='\0';			memcpy(strResult+nTotal,strAT,nRes);			nTotal+=nRes;			ch=0;		}		else		{			if(ch++==nATReadTimes)				break;		}	}	strResult[nTotal]='\0';	tcflush(fd,TCIFLUSH);	//check if OK	if(strstr(strResult,strPrompt)!=NULL)	{		return 1;	}	else		return 0;}int callph(int fd,const char *phNumber){	char strATResult[BUFSIZE];	char strAT[BUFSIZE];	fd=openTerm(fd,&newtio,&oldtio,115200);	GPRSD_DEBUG("callph %s fd:%d\n",phNumber,fd);	sprintf(strAT,"atd%s;%c",phNumber,0x0d);	ATComUntilStr(fd,strAT,"CARRIER",strATResult,ATREADTIMES);	GPRSD_DEBUG("calling %s...\n",phNumber);	while(readTerm(fd,"CARRIER"))	{		if(readTerm(fd,"OK"))				break;		GPRSD_DEBUG("calling have halt!!!\n",NULL);		closeTerm(fd);		return 0;	}	GPRSD_DEBUG("CALLing have connect!!!\n",NULL);	playWav("test.wav");	while(!readTerm(fd,"CARRIER"));	GPRSD_DEBUG("calling have halt!!!\n",NULL);	closeTerm(fd);	return 1;}int haltph(int fd){	char strATResult[BUFSIZE];	char strAT[BUFSIZE];	fd=openTerm(fd,&newtio,&oldtio,115200);	GPRSD_DEBUG("haltph  fd:%d\n",fd);	sprintf(strAT,"ath%c",0x0d);	ATComUntilStr(fd,strAT,"CARRIER",strATResult,ATREADTIMES);	GPRSD_DEBUG("haltph ...\n",NULL);/*	while(!readTerm(fd,"OK"))	{		if(total++ > ATTRYTIMES)		{			closeTerm(fd);			return 0;		}	}*/	GPRSD_DEBUG("CALLing have halt!!!\n",NULL);	closeTerm(fd);	return 1;}static char *getline(char *message){	if(*message && strlen(message)>0)	{		while(*message!='\n')		{			message++;		}		*message='\0';		return ++message;	}	return NULL;}static void analysis(int fd,char *message){	char *str;	char *buf;	int i,c=0;	while(message!='\0' && message)	{		buf=message;		message=getline(message);		if(strncmp(buf,"OK",2)==0)		{			c=0;			printf("\n");			printf("%s\n",mess.mess_n);			printf("%s\n",mess.time_m);			printf("%s\n",mess.mess_info);			gprs_do_request(fd,mess.mess_info);			bzero(&mess,sizeof(mess));			bzero(buf,sizeof(buf));			break;		}//读取了一条短信		if(strstr(buf,"CMGR")!=NULL)		{			i=0;			mess.mess_t=HREAD;			str=strstr(buf,",\"");			str++;			str++;			while((*str)!='\"')			{				mess.mess_n[i]=*str;				i++;				str++;			}			str=str+4;			i=0;			while((*str)!='\"')			{				mess.time_m[i]=*str;				i++;				str++;			}			continue;		}		if(strstr(buf,"CMGL")!=NULL)		{			i=0;			mess.mess_t=UNREAD;			str=strstr(buf,"\",\"");			str=str+3;			while(*str!='\"')			{				mess.mess_n[i]=*str;				i++;				str++;			}			i=0;			str=str+4;			while(*str!='\"')			{				mess.time_m[i]=*str;				i++;				str++;			}			continue;		}		if((strstr(buf,"at+cmgr")!=NULL)||(strstr(buf,"at+cmgl")!=NULL))		{			continue;		}		else		{			i=0;			while(buf[i]!='\0')			{				if(buf[i]=='\n')				{					i++;					continue;				}				mess.mess_info[c]=buf[i];				i++;				c++;			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -