/********************************************************************************
* Copyright: (C) 2016 leiyuxing <leiyuxing205@gmail.com>
* All rights reserved.
*
* Filename: answer_call_receive_message.c
* Description: This file
*
* Version: 1.0.0(2016年08月10日)
* Author: leiyuxing <leiyuxing205@gmail.com>
* ChangeLog: 1, Release initial version on "2016年8月10日20时18分00秒"
*
********************************************************************************/
#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> /*字符串操作的定义*/
void serial_init(int fd)<span style="white-space:pre"> </span>//串口初始化函数
{
struct termios options;
tcgetattr(fd, &options);//读取串口参数设置
options.c_cflag |= (CLOCAL | CREAD);//设置忽略modem控制线,打开接收者
options.c_cflag &= ~CRTSCTS;//设置CRTSCTS(不属于POSIX)启用RTS/CTS(硬件)流控制
options.c_cflag &= ~CSIZE;//设置数据位
options.c_cflag |= CS8;//设置8位数据位
options.c_cflag &= ~CSTOPB;//设置停止位 - 1位停止位
options.c_iflag |= IGNPAR;//设置忽略帧错误和奇偶校验错误
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B115200); //根据自己的波特率进行相应更改
cfsetospeed(&options, B115200);
tcsetattr(fd, TCSANOW, &options);//读取串口的参数设置并立即生效
}
int receive_call(int fd)<span style="white-space:pre"> </span>//接听电话函数
{
char buff[16];
char reply[16];
int nread;
int nwrite;
int choice;
getchar();
memset(buff,0,sizeof(buff));
strcpy(buff,"ata\r");
nwrite=write(fd,buff,strlen(buff));
printf("nwrite1=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread=read(fd,reply,sizeof(reply));
printf("nread1=%d,%s\n",nread,reply);
printf("input 1 to ath.\n");<span style="white-space:pre"> </span>//接听结束挂电话
choice = getchar();
getchar();
switch(choice)
{
case '1':memset(buff,0,sizeof(buff));
strcpy(buff,"ath\r");
nwrite=write(fd,buff,strlen(buff));
printf("nwrite1=%d,%s\n",nwrite,buff);
break;
default : break;
}
}
int reject_call(int fd) <span style="white-space:pre"> </span>//拒接电话函数
{
char buff[16];
char reply[16];
int nread;
int nwrite;
getchar();
memset(buff,0,sizeof(buff));
strcpy(buff,"ath\r");
nwrite=write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread=read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
int main(int argc, char **argv)
{
int fd;
char buff[16];
char reply[16];
int choice;
int nread;
int nwrite;
char str[]="\n\nRING"; //定义AT指令测试来电时的响应,要和AT指令测试时一致
[cpp] view plain copy
fd=open("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
if(fd<0)
{
perror("Can't open the serial port!\n");
}
serial_init(fd);
memset(buff,0,16);
strcpy(buff,"at+cnmi=3,2");<span style="white-space:pre"> </span>//新短信息的提示接收
strcpy(buff,"at\r");
strcat(buff,"\r");
nwrite=write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,16);
sleep(1);
nread=read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
while(1)
{
memset(reply,0,16);
sleep(1);
nread=read(fd,reply,sizeof(reply));
if(!(strncmp(reply,str,6))) //比较两个字符串,若不相等则实现下列功能
{
printf("Ring is coming\n ");
printf("please enter you select: 1,answer the call 2,reject the call 3,receive message \n");
choice = getchar();
switch(choice)
{
case '1':answer_the_call(fd);
break;
case '2':reject_the_call(fd);
break;
case '3':receive_message(fd);
break;
default :break;
}
}
}
close(fd);
return 0;
}