📄 gprs_modem_test.c
字号:
/*
*Copyright (c) 2006 .南京e嵌嵌入式科技有限公司
*All rights reserved
*
*filename :gprs_modem_test.c
*
*version 1.0
*
*author:lichao
*completed:20060412
*
*description:The file is used to test whether the gprs modem works correctly
*
*email:lichao@njupt.edu.cn
*/
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix标准函数定义*/
#include <sys/types.h> /**/
#include <sys/stat.h> /**/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <string.h>
#define FALSE 0
#define TRUE 1
struct shortmsg
{
int index;
char msgcontent[100];
char sender[20];
time_t sendtime;
};
int speed_arr[] = { B38400, B57600,B19200, B9600, B4800, B2400, B1200, B300 };
int name_arr[] = {38400, 57600, 19200, 9600, 4800, 2400, 1200, 300 };
char *DEV="/dev/ttyS0";
char gprs_reply_buf[100];
//int fd;
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;/*屏蔽字符大小位*/
switch (databits) /*设置数据位数*/
{
case 5:
options.c_cflag |= CS5;//选择5位数据位
break;
case 6:
options.c_cflag |= CS6;//选择6位数据位
break;
case 7:
options.c_cflag |= CS7;//选择7位数据位
break;
case 8:
options.c_cflag |= CS8;//选择8位数据位
break;
default:
fprintf(stderr,"Unsupported data size\n");
return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity,无校验位*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
/*如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,
那么使用原始模式(Raw Mode)方式来通讯,设置方式如下*/
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_cc[VTIME] = 10; // 1 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
/**
*设置流控
*/
void SetFlowControl(int com,int mode)
{
struct termios options;
if ( tcgetattr( com,&options) != 0)
{
perror("SetupSerial 1");
return;
}
switch(mode)
{
case 1:
options.c_cflag &= ~CRTSCTS;//无流控
break;
case 2:
options.c_cflag |= CRTSCTS;//硬件流控
break;
case 3:
options.c_cflag |= IXON|IXOFF|IXANY;//软件流控
}
tcsetattr(com,TCSANOW,&options);
}
/**
*@breif 打开串口,
*参数Dev为打开设备的设备名,如/dev/ttyS0
*返回值:-1:打开失败,否则返回打开设备的设备句柄
*/
int Open_Init_COM(char *Dev)
{
int com=open( Dev, O_RDWR | O_NOCTTY); //| O_NOCTTY | O_NDELAY
if (-1 == com)
{
/*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
/*初始化串口*/
//设置串口属性
fcntl(com,F_SETFL,0);//没有数据就阻塞,直到数据到来或者到了规定时间。
//如果要使read()函数立即返回,请用fcntl(com,F_SETFL,FNDELAY)函数
set_speed(com,57600);//速度9600BPS
set_parity(com,8,1,'s');//数据位8位,1位停止位,没有奇偶校验位
SetFlowControl(com,1); //无流控
return com;
}
/**
*从串口读取数据
*/
int ReadCOM(int n,char *buf,int length)
{
return read(n,buf,length);
}
/**
*向串口写数据
*/
int WriteCOM(int n,char *buf,int length)
{
return write(n,buf,length);
}
/**
*关闭串口
*/
int CloseCOM(int n)
{
return close(n);
}
/*
*发送GPRS命令
*参数com:串口设备句柄,at_cmd_array:发送短信命令集,pMsg:指向要发送的内容
*返回值:-1:成功
0或正整数:失败,返回第几条命令失败
*/
int Gprs_SendMessage(int com,char at_cmd_array[][30],char * pMsg)
{
int i,nRead,k=0,num=0;
char gprs_reply_buf[100];
char *at_cmd=at_cmd_array[0];
while(strcmp(at_cmd,""))
{
at_cmd=at_cmd_array[k++];
bzero(gprs_reply_buf,100);
WriteCOM(com,at_cmd,strlen(at_cmd));
sleep(2);
if(strstr(at_cmd,"AT+CMGS")!=NULL)
{
//SEND MESSAGE
strcat(pMsg,"\\r\x01a");
WriteCOM(com,pMsg,strlen(pMsg));
sleep(6);
}
//sleep(5);
nRead=ReadCOM(com,gprs_reply_buf,100);
if(strstr(gprs_reply_buf,"OK")!=NULL)
{
num++;
continue;
}
//如果失败,返回第几条命令出错
return num;
}
return -1;
}
/*
*接收短消息前的准备
*/
int Gprs_MessageReady(int com,char at_cmd_array[][30])
{
int nRead,k=0,num=0;
char gprs_buf[100];
char *at_cmd;
at_cmd=at_cmd_array[k++];
while(strcmp(at_cmd,"")) {
bzero(gprs_buf,100);
WriteCOM(com,at_cmd,strlen(at_cmd));
sleep(1);
at_cmd=at_cmd_array[k++];
if((nRead=ReadCOM(com,gprs_buf,100))<0) {
perror("ReadCOM error");
return -1;
}
printf("num=%d gprs_buf=%s",num,gprs_buf);
if(strstr(gprs_buf,"OK")!=NULL) {
num++;
continue;
}else
{
return num;
}
}
return 0;
}
/*
解析短信内容
*/
int Gprs_AnalyzeMessage(char *as_gprs_info,struct shortmsg *pShortMsg) {
/* struct shortmsg
{
int index;
char msgcontent[100];
char sender[12];
time_t sendtime;
};*/
char *pGprs_sender,*pGprs_time,*pGprs_con,*pGprs_con_last;
char Gprs_recvcon[100];
int i=0,j=0;
memset(pShortMsg->sender,0,20);
memset(pShortMsg->msgcontent,0,100);
if((pGprs_sender=strstr(as_gprs_info,"+86"))==NULL) return 1;
strncpy(pShortMsg->sender,pGprs_sender,14);
printf("sender %s\n",pShortMsg->sender);
if((pGprs_time=strstr(pGprs_sender,"\",,\""))==NULL) return 2;
/* pShortMsg->sendtime=time(NULL);
printf("sendtime %s",pShortMsg->sendtime);*/
if((pGprs_con=strchr(pGprs_time,'\r'))==NULL) return 3;
pGprs_con+=2;
while(isalnum(pGprs_con[i]))
{
Gprs_recvcon[j]=pGprs_con[i];
i++;j++;
}
strcpy(pShortMsg->msgcontent,Gprs_recvcon);
printf("msgcontent %s\n",pShortMsg->msgcontent);
return 0;
}
/*
*收短信,并将短信内容解析出来
*/
int Gprs_ReceiveMessage(int com,char at_cmd_array[][30],struct shortmsg *pShortMsg)
{
int i,nRead,k=0,num=0,reval;
char gprs_rev_Number[20],gprs_rev_buf[100];
char *ptr;
char *at_cmd;
char message_info[][15]={{"AT+CMGR="},{"AT+CMGD="}};
char get_message[25],del_message[25];
char getNumber[10],*catNumber;
catNumber=getNumber;
reval=Gprs_MessageReady(com,at_cmd_array);
if(reval==0)
{
printf("receive message success\n");
}
else
{
printf("AT COMMAND num=%d %s EXECUTE ERROR\n",reval,at_cmd_array[reval]);
}
while(1) {
if((nRead=ReadCOM(com,gprs_rev_Number,100))>0)
{
k=0;
for(i=0;i<nRead;i++) {
if(gprs_rev_Number[i]>='0'&&gprs_rev_Number[i]<='9') {
getNumber[k++]=gprs_rev_Number[i];
}
}
getNumber[k++]='\r';
memset(get_message,0,25);
memset(del_message,0,25);
strncpy(get_message,message_info[0],strlen(message_info[0]));
strncpy(del_message,message_info[1],strlen(message_info[1]));
strncat(get_message,catNumber,k);
strncat(del_message,catNumber,k);
pShortMsg->index=atoi(catNumber);
WriteCOM(com,get_message,strlen(get_message));
sleep(2);
if((nRead=ReadCOM(com,gprs_rev_buf,100))>0)
{
printf("Short msg %s",gprs_rev_buf);
reval=Gprs_AnalyzeMessage(gprs_rev_buf,pShortMsg);
}
// WriteCOM(com,del_message,strlen(del_message));
}
}
}
int main(void)
{
int fd,reval;
char SendMessageCmd[][30]={{"ATZ\r"},{"AT+CMGF=1\r"},{"AT+CSCA=\"+8613800250500\"\r"},{"AT+CMGS=\"13913004799\"\r"},{""}};
char *pSendMessage="hello";
int Try_Send=3;//发送短信3次
int Try_Receive=3;
struct shortmsg * pRevMsg=(struct shortmsg *)malloc(sizeof(struct shortmsg));
char *pRecvMessage[1024];
char ReceiveMessageCmd[][30]={{"ATZ\r"},{"AT+CMGF=1\r"},{"AT+CSCA=\"+8613800250500\"\r"},{"AT+CNMI=2,1,,1\r"},{""}};
if((fd=Open_Init_COM(DEV))==-1)
{
exit(0);
}
/*
while ((Try_Send--)>=0)
{
reval=Gprs_SendMessage(fd,SendMessageCmd,pSendMessage);
if(-1==reval)
{
printf("send message success\n");
break;
}
else
{
printf("AT COMMAND %s EXECUTE ERROR\n",SendMessageCmd[reval]);
}
}
*/
reval=Gprs_ReceiveMessage(fd,ReceiveMessageCmd,pRevMsg);
if(-1==reval)
{
printf("receive message success\n");
}
else
{
printf("AT COMMAND %s EXECUTE ERROR\n",ReceiveMessageCmd[reval]);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -