📄 term.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 + -