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

📄 gsm_gprs.c

📁 基于LINUX 平台的GPRS通信
💻 C
字号:
/*this is a test about GPRS*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>	/* open() close() */#include <unistd.h>	/* read() write()*/#include <termios.h>	/* set baud rate*/#include <fcntl.h>#include <sys/select.h>#include <sys/time.h>#include <sys/types.h>#define FUNC_RUN		0#define FUNC_NOT_RUN		1#define SIMPLE_TEST 		1#define READ_SIM_CARD_ID 	2#define MAKE_A_CALL 		3#define WAIT_A_CALL	 		4#define SHORT_MESSAGE 		5#define FUNC_QUIT 			6#define SEND_SHORT_MESSAGE		1#define READ_SHORT_MESSAGE		2#define CONFIG_SHORT_MESSAGE_ENV        3#define QUIT_SHORT_MESSAGE		4#define DEVICE_TTYS "/dev/ttyS1"#define MAX_LEN_OF_SHORT_MESSAGE	140#define RECEIVE_BUF_WAIT_1S 1#define RECEIVE_BUF_WAIT_2S 2#define RECEIVE_BUF_WAIT_3S 3#define RECEIVE_BUF_WAIT_4S 4#define RECEIVE_BUF_WAIT_5S 5/*----------------- read datas from GSM/GPRS --------------------------*//*succese return 1*//*error return 0*//*读取串口缓冲区中的数据*/int read_GSM_GPRS_datas(int fd, char *rcv_buf,int rcv_wait){	int retval;	fd_set rfds;	/* fd_set 定义 文件描述符集 */	struct timeval tv;	int ret,pos;	tv.tv_sec = rcv_wait;	/* 等待时间 */	tv.tv_usec = 0;	pos = 0; /* point to rceeive buf */		while (1)	{		FD_ZERO(&rfds);		/* 清除文件描述符集rfds */		FD_SET(fd, &rfds);	/* 将文件描述符fd 加入到文件描述符集rfds */		/*使用select函数判断是否接收缓冲区内有数据,		 如果在等待了([tv.tv_sec]秒+[tv.tv_usec]微秒)后没有数据,		 则retval=0,出错时 retval=-1,retval其它情况时表示接收到了数据*/		retval = select(fd+1 , &rfds, NULL, NULL, &tv);		/* 函数select用于解决I/O复用,成功返回准备好的文件描述符,错误返回’-1’ */		if (retval == -1) 		{			perror("select()");			break;		}		else if (retval) 		{/*使用read函数读出接收缓冲区中的内容,存放在数组rcv_buf[]中,			如果接收正确,ret=接收到的字节数*/						ret = read(fd, rcv_buf+pos, 2048); /**ret返回实际读得的字符数*/			pos += ret;			if (rcv_buf[pos-2] == '\r' && rcv_buf[pos-1] == '\n') 			{/*当接收到的字符为‘\r’或者‘\n‘时表示接收了一行数据,				但并不代表接收数据完成,当接收到以’\r‘’\n‘为结尾的字符串,				并且再等待了([tv.tv_sec]秒+[tv.tv_usec]微秒)没有新的数据时,				认为接收一次数据完成*/								FD_ZERO(&rfds);				FD_SET(fd, &rfds);				retval = select(fd+1 , &rfds, NULL, NULL, &tv);				if (!retval) 					break;/*没有数据,退出*/			}		} 		else 		{			printf("No data\n");			break;		}	}	return 1;} /* end read_GSM_GPRS_datas*//*------------------ send cmd --------------------------*//* succese return 1 *//* error   return 0 *//*用于发送数据*/int send_GSM_GPRS_cmd(int fd, char *send_buf){/*将send_buf中的内容发送到fd指向的设备,发送正确	 ret返回发送的字节数,发送错误ret返回“-1”*/		ssize_t ret;		ret = write(fd,send_buf,strlen(send_buf));	if (ret == -1)	{		printf ("write device %s error\n", DEVICE_TTYS);		return -1;	}	return 1;} /*end send_GSM_GPRS_cmd*/ /*--------------- send cmd and read back result -----------------------*/void GSM_GPRS_send_cmd_read_result(int fd, char *send_buf, int rcv_wait){	char rcv_buf[2048];	/*当发送数据为空时,只接收数据;有数据发送时,发送成功后接收*/	if((send_buf==NULL) || (send_GSM_GPRS_cmd(fd,send_buf)))	{	/* send success , then read*/				bzero(rcv_buf,sizeof(rcv_buf)); /*清空接收数组*/				if (read_GSM_GPRS_datas(fd,rcv_buf,rcv_wait))		{	/*成功接收到数据,并打印*/			printf ("%s\n",rcv_buf);		}		else		{			printf ("read error\n");		}	}	else	{		printf("write error\n");	}} /* end GSM_GPRS_send_cmd_read_result *//*----------------- send cmd : "at" to GSM/GPRS MODEM ---------------------*//*发送一个最简单的AT 命令,查看GPRS模块是否连接正确,	嵌入式处理器发送命令 :at	如果模块工作正常,收到后返回 :ok */void GSM_simple_test(int fd){	char *send_buf="at\r"; /* 这里的字符’\r‘表示AT命令的结束 */		GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);} /* end GSM_simple_test*//*--------------- send cmd : "at+ccid" to GSM/GPRS MODEM ------------*//*查看SIM卡的ID号:	嵌入式处理器发送命令 :at+ccid	如果SIM卡正确安装,模块工作正常,收到后返回SIM卡ID,以OK 结束 */void GSM_read_sim_card_id(int fd){	char *send_buf="at+ccid\r";	GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);} /*end GSM_read_sim_card_id *//*----------------- send cmd : "atd<tel_num>;" to GSM/GPRS MODEM ------*//*----------------- finish call, send cmd:  "ath" to GSM MODEM --------*//*呼叫用户输入的号码 嵌入式处理器发送命令 :atd<电话号码>; 按下回车健,将退出此次呼叫  */void GSM_call(int fd){	char send_buf[17];	char *send_cmd_ath = "ath\r";	int i;	/*input telephone number*/	bzero(send_buf,sizeof(send_buf));		send_buf[0]='a';	send_buf[1]='t';	send_buf[2]='d';	send_buf[16] = '\0';	printf("please input telephone number:");	i = 3;	while (1)	{		send_buf[i]=getchar();		if (send_buf[i]=='\n') 		break;		i++;	}	send_buf[i]=';';	send_buf[i+1]='\r';	/* end input telphone number */	/* send cmd */	GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);		/*quit call 按回车键 */	printf("press ENTER for quit:");	getchar();	/* send cmd */	GSM_GPRS_send_cmd_read_result(fd,send_cmd_ath,RECEIVE_BUF_WAIT_1S);	} /* end GSM_call *//*---------------- wait for GSM/GPRS call signal -------------------*//* 不断检查接收缓冲,查看本地号码是否被呼叫	当检测到有振铃信号时,在屏幕显示RING	检测一段时间后自动退出	 */void GSM_wait_call(int fd){	char rcv_buf[2048];	char *send_cmd_ath = "ath\r";	int wait_RING;		wait_RING = 10;		while (wait_RING!=0)	{			bzero(rcv_buf,sizeof(rcv_buf));		if (read_GSM_GPRS_datas(fd,rcv_buf,RECEIVE_BUF_WAIT_1S))		{			printf ("%s\n",rcv_buf);		}		else		{			printf ("read error\n");		}		wait_RING--;	}		GSM_GPRS_send_cmd_read_result(fd,send_cmd_ath,RECEIVE_BUF_WAIT_1S);	printf("quit wait_call\n");} /* end GSM_wait_call *//*------------ GSM/GPRS send short message --------------------------*//* 发送短消息 :输入电话号码与短消息内容,将短消息发出*/void GSM_Send_Message(int fd){	char cmd_buf[23];	char short_message_buf[MAX_LEN_OF_SHORT_MESSAGE];	int  i;		/* char rcv_buf;*/	bzero(cmd_buf,sizeof(cmd_buf));	bzero(short_message_buf,sizeof(short_message_buf));	printf ("send short message:\n");	cmd_buf[0]='a';	cmd_buf[1]='t';	cmd_buf[2]='+';	cmd_buf[3]='c';	cmd_buf[4]='m';	cmd_buf[5]='g';	cmd_buf[6]='s';	cmd_buf[7]='=';	cmd_buf[8]='"';	printf ("please input telephone number:");	i = 9;	while (1)	{		cmd_buf[i]=getchar();		if (cmd_buf[i]=='\n') break;		i++;	}	cmd_buf[i]='"';	cmd_buf[i+1]='\r';	cmd_buf[i+2]='\0';	/* send cmd :  at+cmgs="(telephone number)"*/	GSM_GPRS_send_cmd_read_result(fd,cmd_buf,RECEIVE_BUF_WAIT_1S);		/* input short message */	printf("please input short message:");	i = 0;	while(i < MAX_LEN_OF_SHORT_MESSAGE-2)	{		short_message_buf[i] = getchar();		if (short_message_buf[i]=='\n') 			break; /*接收到回车符时,认为输入完成*/		i++;	}	short_message_buf[i] = 0x1A;	short_message_buf[i+1] = '\r';	short_message_buf[i+2] = '\0';	/* send short message */	GSM_GPRS_send_cmd_read_result(fd, short_message_buf,RECEIVE_BUF_WAIT_4S);	printf("\nend send short message\n");} /* end GSM_Send_Message *//*----------------- GSM/GPRS read all short message ----------------*//*查收所有短消息*/void GSM_Read_Message(int fd){	char *send_buf="at+cmgl=\"ALL\"\r";	/*char rcv_buf[2048];*/	GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_3S);	printf("end read all short message\n");} /* end GSM_Read_Message *//*-------------- GSM/GPRS Config short message env -----------------*//* 配置短消息模式为文本模式;短消息服务中心号码为+8613800100500*/void GSM_Conf_Message(int fd){	char *send_buf="at+cmgf=1\r";	char *send_center_buf="at+csca=\"+8613800100500\"\r";	GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);	/* set short message center number*/	GSM_GPRS_send_cmd_read_result(fd,send_center_buf,RECEIVE_BUF_WAIT_1S);	printf("end config short message env\n");} /* end GSM_Conf_Message *//*------------------ GSM/GPRS short message --------------------*/void GSM_short_mesg(int fd){	int flag_sm_run, flag_sm_select;	flag_sm_run = FUNC_RUN;		while (flag_sm_run == FUNC_RUN)	{	/*打印短消息功能列表*/		printf ("\n Select:\n");		printf ("1 : Send short message \n");		printf ("2 : Read all short message \n");		printf ("3 : Config short message env\n");		printf ("4 : quit\n");		printf (">");		scanf("%d",&flag_sm_select);		getchar();			switch (flag_sm_select)		{			case SEND_SHORT_MESSAGE					:			{ 				GSM_Send_Message(fd);				break; 			}			case READ_SHORT_MESSAGE					:			{ 				GSM_Read_Message(fd);				break; 			}			case CONFIG_SHORT_MESSAGE_ENV		:			{ 				GSM_Conf_Message(fd);				break; 			}			case QUIT_SHORT_MESSAGE					:			{ 				flag_sm_run = FUNC_NOT_RUN;					break; 			}			default : 			{				printf("please input your select use 1 to 3\n");			}		}	}	printf ("\n");} /* end GSM_send_mesg*//*--------------------- print -----------------------*/void print_prompt(void){/*显示选择菜单信息*/	printf ("Select what you want to do:\n");	printf ("1 : Simple Test\n");	printf ("2 : Read SIM CARD ID\n");	printf ("3 : Make A Call\n");	printf ("4 : Wait A Call\n");	printf ("5 : Short message\n");	printf ("6 : Quit\n");	printf (">");} /*end print_prompt*/ /*---------------- Control GSM/GPRS MODULE ------------------*/void func_GSM(int fd){/*测试函数入口*/	int flag_func_run;	int flag_select_func; /*记录用户的选选择输入*/		flag_func_run = FUNC_RUN;/*FUNC_RUN 已经定义为 0 */	while (flag_func_run == FUNC_RUN)	{		print_prompt();			/*显示选择菜单信息*/		scanf("%d",&flag_select_func);	/*获取用户输入的选择*/		getchar();/*截取回车符*/		switch(flag_select_func)		{/*根据用户的选择调用响应的函数*/			case SIMPLE_TEST: 			{				GSM_simple_test(fd);				break;			}			case READ_SIM_CARD_ID: 			{				GSM_read_sim_card_id(fd);				break;			}			case MAKE_A_CALL: 			{				GSM_call(fd);				break;			}			case WAIT_A_CALL: 			{				GSM_wait_call(fd);				break;			}			case SHORT_MESSAGE:			{				GSM_short_mesg(fd);				break;			}			case FUNC_QUIT:			{ 				flag_func_run = FUNC_NOT_RUN; /*FUNC_NOT_RUN已定义为1*/				printf("Quit GSM/GPRS function.  byebye\n");				break;							}			default :			{				printf("please input your select use 1 to 7\n");			}		}	}}/*end func_GPRS*/ /*---------------------- init seriel port  -----------------------------*/void init_ttyS(int fd){/*配置串口设备*/	struct termios options;/*定义options,主要串口设置*/		bzero( &options, sizeof( options ));  /*将options的信息清零*/	cfsetispeed(&options,B9600);     /*设置通讯波特率*/ 	cfsetospeed(&options,B9600);	options.c_cflag |= (CRTSCTS | CS8 | CLOCAL | CREAD);	/*CRTSCTS有流控制   CS8 8位数据位 1位停止位	CLOCAL 本地连接,无调制调解器控制 CREAD 允许接收数据*/		options.c_iflag = IGNPAR; /*忽略奇偶校验*/		/*设置等待时间和最小接收字符*/	options.c_cc[VTIME] = 0;	options.c_cc[VMIN] = 0;	tcflush(fd, TCIFLUSH);/*TCIFLUSH 刷清输入队列,溢出数据可以接收,但不读*/	tcsetattr(fd, TCSANOW, &options);/*启用新的串口设置,将其属性赋予串口,TSANOW表示立即生效*/}/*end init_ttyS*//*---------------------- main -----------------------------*/int main(void){	int fd; /*用于记录文件描述符(端口)*/	printf("\nGSM/GPRS TESTS\n\n");	/*以读写方式打开串口  */	fd = open(DEVICE_TTYS, O_RDWR); 	/*#define DEVICE_TTYS "/dev/ttyS0"前面已经定义*/	if (fd == -1)	{/*串口打开失败*/		printf("open device %s error\n",DEVICE_TTYS);	}	else	{/*串口成功打开*/			init_ttyS(fd);	/*初始化串口设备*/		func_GSM(fd);	/*进行GSM/GPRS测试*/					/*关闭串口*/		if (close(fd)!=0) /*关闭串口*/		printf("close device %s error",DEVICE_TTYS);	}	return 0;}/*end main*/

⌨️ 快捷键说明

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