#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
#include "gprs_auto.h"
struct termios newtio1,oldtio1; //在<termios.h>定义的一个数据结构。
/*****************完成设置串口的波特率,校验位、停止位***************/
int set_opt1(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
if ( tcgetattr( fd,&oldtio1) != 0) {
perror("SetupSerial 1");
return -1;
}
bzero( &newtio1, sizeof( newtio1 ) );
newtio1.c_cflag |= CLOCAL | CREAD;
newtio1.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio1.c_cflag |= CS7;
break;
case 8:
newtio1.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'O':
newtio1.c_cflag |= PARENB;
newtio1.c_cflag |= PARODD;
newtio1.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio1.c_iflag |= (INPCK | ISTRIP);
newtio1.c_cflag |= PARENB;
newtio1.c_cflag &= ~PARODD;
break;
case 'N':
newtio1.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio1, B2400);
cfsetospeed(&newtio1, B2400);
break;
case 4800:
cfsetispeed(&newtio1, B4800);
cfsetospeed(&newtio1, B4800);
break;
case 9600:
cfsetispeed(&newtio1, B9600);
cfsetospeed(&newtio1, B9600);
break;
case 115200:
cfsetispeed(&newtio1, B115200);
cfsetospeed(&newtio1, B115200);
break;
case 460800:
cfsetispeed(&newtio1, B460800);
cfsetospeed(&newtio1, B460800);
break;
default:
cfsetispeed(&newtio1, B9600);
cfsetospeed(&newtio1, B9600);
break;
}
if( nStop == 1 )
newtio1.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio1.c_cflag |= CSTOPB;
newtio1.c_cc[VTIME] = 0;
newtio1.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio1))!=0)
{
perror("com set error");
return -1;
}
printf("set done!\n");
return 0;
}
/**************************选择打开哪个串口******************************/
int open_port1(int fd,int comport)
{
char *dev[]={"/dev/tts/0","/dev/tts/1","/dev/tts/2"};
long vdisable;
if (comport==1)
{ fd = open( "/dev/tts/0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
}
else if(comport==2)
{ fd = open( "/dev/tts/1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
}
else if (comport==3)
{
fd = open( "/dev/tts/2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
}
if(fcntl(fd, F_SETFL, 0)<0)
printf("fcntl failed!\n");
else
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return fd;
}
/*******监测室内环境同时报警发送短信通知用户以及控制相应的家居***********/
int auto_sendmes(char *Sendpho,int temMax,int temMin)
{ int fd,fd1,fd2,fd3,fd4;
unsigned char tem_buf[2]; //存储温度
int i;
char Red_buf[2];//存储红外的状态。
int Gprs_temMax,Gprs_temMin;//温度的报警上下限
int temper;//存储温度
int j;
char *Mesmode = "AT+CMGF=1\xd\0";//短信模式为TEXT格式
int Mesmode_length = strlen(Mesmode);
char *Sendms = "AT+CMGS=\"";//发送短信指令
int Sendms_length = strlen(Sendms);
char *Pnumend = "\"\xd\0";//结束符,相当于回车键
char Pnumend_length = strlen(Pnumend);
char Smsh[] = "temperature too high";//短信内容
char Smsl[] = "temperature too low";
char *Red_mes = "person come in your home";
char *sms_end="\x1a\x0a\x0d";//结束符。相当于CTRL+Z。
fd2=open("/dev/GPGIO_12567",O_RDWR|O_NDELAY|O_NOCTTY);//打开IO控制口驱动
fd1=open("/dev/DS18B20",O_RDWR|O_NDELAY|O_NOCTTY);打开温度传感器驱动
fd3=open("/dev/gec2440_pwm",O_RDWR);//打开蜂鸣器驱动
fd4=open("/dev/GPB6_IO",O_RDWR); 打开红外传感器驱动
if((fd=open_port1(fd,2))<0)
{
perror("open_port error");
return -1;
}
if((i=set_opt1(fd,9600,8,'N',1))<0)
{
perror("set_opt error");
return -1;
}
Gprs_temMax=temMax;
Gprs_temMin=temMin;
read(fd1,tem_buf,1);//读取温度值
temper=tem_buf[0];//存入低八位
temper /= 16;
temper +=(tem_buf[1]*16);存入高八位
printf("%d\n",temper);
read(fd4,Red_buf,1);//读取红外状态
if(temper>Gprs_temMax)
{
ioctl(fd2,0,6);//向IO口6写入低电平,让其运转
ioctl(fd2,0,7); //向IO口7写入低电平,让其运转
sleep(1);
ioctl(fd2,1,7);
ioctl(fd3,1,1000);
sleep(2);
ioctl(fd3,0);
write(fd,Mesmode,Mesmode_length);
sleep(1);
write(fd,Sendms,Sendms_length);
write(fd,Sendpho,strlen(Sendpho));
write(fd,Pnumend,Pnumend_length);
sleep(1);
sprintf(Smsh,"%s,now temperature is %d'C",Smsh,temper);
write(fd,Smsh,strlen(Smsh));
write(fd,sms_end,strlen(sms_end));
}
else if(temper<Gprs_temMin)
{
ioctl(fd2,1,6);
ioctl(fd2,1,7);
ioctl(fd3,1,1000);
sleep(2);
ioctl(fd3,0);
write(fd,Mesmode,Mesmode_length);
sleep(1);
write(fd,Sendms,Sendms_length);
write(fd,Sendpho,strlen(Sendpho));
write(fd,Pnumend,Pnumend_length);
sleep(1);
sprintf(Smsl,"%s,now temperature is %d'C\x1a\x0d\x0a",Smsl,temper);
write(fd,Smsl,strlen(Smsl));
write(fd,sms_end,strlen(sms_end));
}
else if(atoi(Red_buf)==0)
{
ioctl(fd3,1,50);
sleep(2);
ioctl(fd3,0);
write(fd,Mesmode,Mesmode_length);
sleep(1);
write(fd,Sendms,Sendms_length);
write(fd,Sendpho,strlen(Sendpho));
write(fd,Pnumend,Pnumend_length);
sleep(1);
write(fd,Red_mes,strlen(Red_mes));
write(fd,sms_end,strlen(sms_end));
}
}
/*********************读取短信内容做相应控制******************************/
int auto_readmes(void)
{
int fd,fd1,fd2,fd3,fd4;
char mes_buf[200];
char cmes_buf[40];
char read_buf[10];
int i,j,k,n;
int m=0;
int l=0;
char *mes_mode="AT+CMGF=1\xd\0";
char *mes_read="AT+CMGR=1\xd\0";
char *mes_del="AT+CMGD=1\xd\0";
char check_buf[5];
int mes_flag=0;
int rm_flag=0;
fd2=open("/dev/GPGIO_12567",O_RDWR|O_NDELAY|O_NOCTTY);
fd1=open("/dev/DS18B20",O_RDWR|O_NDELAY|O_NOCTTY);
fd3=open("/dev/gec2440_pwm",O_RDWR);
fd4=open("/dev/GPB6_IO",O_RDWR);
i