基本功练习_3_2_之(GPRS.c)
2012-03-03 09:53
183 查看
/*************************************************************************
*程序功能:
* 发送中英文短信,拨打报警电话
*
*参数: 主程序向GPRS.c中的gprs(int) 传入因为什么而报警(火警或陌生人闯入)
* 以决定发送火灾报警短信还是陌生人闯入时的报警短信
*
* ***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <termio.h>
#include <errno.h>
#include "GPRS.h"
#define THIEF_INTO 1 //小偷进入
#define FIRE 2 //火灾发生
/*
*函数功能:设置串口属性
*参数:
@fd: 串口文件描述符
@nSpeed: 比特率
@nBit: 有效位个数
@nEvent: 有无校验位
@nStop: 几位停止位
返回值:设置成功与否:
secuss:1
error: 0
* */
int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio) < 0)
{
perror("SetupSerial 1");
return -1;
}
bzero(&newtio,sizeof(newtio));
newtio.c_cflag |= CLOCAL|CREAD;
newtio.c_cflag &= ~CSIZE;
//设置有效数据位个数
switch(nBits)
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch(nEvent)
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK|ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK|ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N'://无奇偶校验
newtio.c_cflag &= ~PARENB;
break;
}
switch(nSpeed)
{
case 2400:
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case 4800:
cfsetispeed(&newtio,B4800);
cfsetospeed(&newtio,B4800);
break;
case 9600:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
case 115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
default:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
}
if(nStop == 1)
{
newtio.c_cflag &= ~CSTOPB;
}
else if(nStop == 2)
{
newtio.c_cflag |= CSTOPB;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);//刷新设置,使设置立即生效
if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
{
perror("com set error");
return -1;
}
printf("set done\n");
return 0;
}
/*
* 函数功能:打开串口
* 参数:
* @comport:打开的串口的号码
* @fd: 打开的文件描述符
* 返回值:打开成功与否
* secuess: 返回打开的串口的文件描述符
* error: -1
* 最后修改时间:2011.12.22
* */
int open_port(int fd,int comport)
{
long vdisable;
if(0 == comport)
{
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(1 == comport)
{
fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(2 == comport)
{
fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(3 == comport)
{
fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(fcntl(fd,F_SETFL,0) < 0)
printf("fcntl error\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 sucess \n");
printf("fd-open=%d\n",fd);
return fd;
}
int gprs(int type)
{
int fd;
int pid;
char string[100];
int n = 0;
/*小偷进屋*/
char send_thief[100] = "0891683110102105F011000D91685115607830F70008000A5C0F50778FDB5C4BFF01";
/*家里着火*/
char send_fire[100] = "0891683110102105F011000D91685115607830F70008000A5bb691cc7740706bff01";
/*打开串口,并设置属性(115200,8位有效数据位,无奇偶校验,1位)*/
//extern pthread_mutex_t GPRS_lock;
// pthread_mutex_lock(&GPRS_lock);
// fd=open_port(fd,2);
set_opt(fd,9600,8,'N',1);
n = write(fd,"at\r",strlen("at\r"));
printf("write=%d\n",n);
printf(".................\n");
/*发送AT,返回ok*/
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT=%d\n",n);
printf("read AT=%s\n",string);
/*短信中心号码*/
//write(fd,"AT+CSCA=\"+8613010112500\"\r",strlen("AT+CSCS=\"+8613010112500\"\r"));
/*write(fd,"AT+CSCA=+8613010112500\r",strlen("AT+CSCS=+8613010112500\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CSCA = %d\n",n);
printf("read AT+CSCA =%s\n",string);
*/
/*
write(fd,"AT+CCID\r",strlen("AT+CCID\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CCID %d\n",n);
printf("read AT+CCID =%s\n",string);
*/
/*发送目标号码*/
//n = write(fd,"AT+CMGS=+8615510687037\r",strlen("AT+CMGS=+8615510687037\r"));
/*发送设置的短信模式*/
write(fd,"AT+CMGF=0\r",strlen("AT+CMGF=0\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CMGF = %d\n",n);
printf("read AT+CMGF =%s\n",string);
write(fd,"AT+CMGS=25\r",strlen("AT+CMGS=25\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read AT+CMGS = %d\n",n);
printf("read AT+CMGS =%s\n",string);
char cmd[100];
bzero(cmd,100);
/*火灾时发出的短信*/
if(THIEF_INTO == type)
{
strcpy(cmd,send_thief);
}
/*盗贼进入时发出的短信*/
if(FIRE == type)
{
strcpy(cmd,send_fire);
}
strcat(cmd,"\x1a");
n = write(fd,cmd,strlen(cmd));
sleep(2);
/*查看网络注册*/
printf("search the internet...............\n");
write(fd,"AT+CREG=?\r",strlen("AT+CRGE=?\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read AT+CRGE = %d\n",n);
printf("read AT+CRGE =%s\n",string);
/*拨号 ATD + 电话号码(别忘了加";")*/
printf("call..................\n");
write(fd,"ATD +8615510687037;\r",strlen("ATD +8615510687037;\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read ATD = %d\n",n);
printf("read ATD =%s\n",string);
/* if(n < 0)
{
printf("send message error\n");
return -1;
}
printf("write message = %d\n",n);
printf("send end\n");
sleep(1);
close(fd);
*/
// pthread_mutex_unlock(&GPRS_lock);
/*sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read message %d\n",n);
printf("read message =%s\n",string);
*/
return 1;
}
FILE *fd;
/* int main(void)
{
//FILE *fd;
printf("11111111111\n");
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
printf("22222222222\n");
set_opt(fd,9600,8,0,0);
gprs(THIEF_INTO);
return 0;
}
*///测试代码
*程序功能:
* 发送中英文短信,拨打报警电话
*
*参数: 主程序向GPRS.c中的gprs(int) 传入因为什么而报警(火警或陌生人闯入)
* 以决定发送火灾报警短信还是陌生人闯入时的报警短信
*
* ***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <termio.h>
#include <errno.h>
#include "GPRS.h"
#define THIEF_INTO 1 //小偷进入
#define FIRE 2 //火灾发生
/*
*函数功能:设置串口属性
*参数:
@fd: 串口文件描述符
@nSpeed: 比特率
@nBit: 有效位个数
@nEvent: 有无校验位
@nStop: 几位停止位
返回值:设置成功与否:
secuss:1
error: 0
* */
int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio) < 0)
{
perror("SetupSerial 1");
return -1;
}
bzero(&newtio,sizeof(newtio));
newtio.c_cflag |= CLOCAL|CREAD;
newtio.c_cflag &= ~CSIZE;
//设置有效数据位个数
switch(nBits)
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch(nEvent)
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK|ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK|ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N'://无奇偶校验
newtio.c_cflag &= ~PARENB;
break;
}
switch(nSpeed)
{
case 2400:
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case 4800:
cfsetispeed(&newtio,B4800);
cfsetospeed(&newtio,B4800);
break;
case 9600:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
case 115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
default:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
}
if(nStop == 1)
{
newtio.c_cflag &= ~CSTOPB;
}
else if(nStop == 2)
{
newtio.c_cflag |= CSTOPB;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);//刷新设置,使设置立即生效
if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
{
perror("com set error");
return -1;
}
printf("set done\n");
return 0;
}
/*
* 函数功能:打开串口
* 参数:
* @comport:打开的串口的号码
* @fd: 打开的文件描述符
* 返回值:打开成功与否
* secuess: 返回打开的串口的文件描述符
* error: -1
* 最后修改时间:2011.12.22
* */
int open_port(int fd,int comport)
{
long vdisable;
if(0 == comport)
{
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(1 == comport)
{
fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(2 == comport)
{
fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(3 == comport)
{
fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd)
{
perror("can not open the port");
return -1;
}
}
if(fcntl(fd,F_SETFL,0) < 0)
printf("fcntl error\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 sucess \n");
printf("fd-open=%d\n",fd);
return fd;
}
int gprs(int type)
{
int fd;
int pid;
char string[100];
int n = 0;
/*小偷进屋*/
char send_thief[100] = "0891683110102105F011000D91685115607830F70008000A5C0F50778FDB5C4BFF01";
/*家里着火*/
char send_fire[100] = "0891683110102105F011000D91685115607830F70008000A5bb691cc7740706bff01";
/*打开串口,并设置属性(115200,8位有效数据位,无奇偶校验,1位)*/
//extern pthread_mutex_t GPRS_lock;
// pthread_mutex_lock(&GPRS_lock);
// fd=open_port(fd,2);
set_opt(fd,9600,8,'N',1);
n = write(fd,"at\r",strlen("at\r"));
printf("write=%d\n",n);
printf(".................\n");
/*发送AT,返回ok*/
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT=%d\n",n);
printf("read AT=%s\n",string);
/*短信中心号码*/
//write(fd,"AT+CSCA=\"+8613010112500\"\r",strlen("AT+CSCS=\"+8613010112500\"\r"));
/*write(fd,"AT+CSCA=+8613010112500\r",strlen("AT+CSCS=+8613010112500\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CSCA = %d\n",n);
printf("read AT+CSCA =%s\n",string);
*/
/*
write(fd,"AT+CCID\r",strlen("AT+CCID\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CCID %d\n",n);
printf("read AT+CCID =%s\n",string);
*/
/*发送目标号码*/
//n = write(fd,"AT+CMGS=+8615510687037\r",strlen("AT+CMGS=+8615510687037\r"));
/*发送设置的短信模式*/
write(fd,"AT+CMGF=0\r",strlen("AT+CMGF=0\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read AT+CMGF = %d\n",n);
printf("read AT+CMGF =%s\n",string);
write(fd,"AT+CMGS=25\r",strlen("AT+CMGS=25\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read AT+CMGS = %d\n",n);
printf("read AT+CMGS =%s\n",string);
char cmd[100];
bzero(cmd,100);
/*火灾时发出的短信*/
if(THIEF_INTO == type)
{
strcpy(cmd,send_thief);
}
/*盗贼进入时发出的短信*/
if(FIRE == type)
{
strcpy(cmd,send_fire);
}
strcat(cmd,"\x1a");
n = write(fd,cmd,strlen(cmd));
sleep(2);
/*查看网络注册*/
printf("search the internet...............\n");
write(fd,"AT+CREG=?\r",strlen("AT+CRGE=?\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read AT+CRGE = %d\n",n);
printf("read AT+CRGE =%s\n",string);
/*拨号 ATD + 电话号码(别忘了加";")*/
printf("call..................\n");
write(fd,"ATD +8615510687037;\r",strlen("ATD +8615510687037;\r"));
sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,50);
printf("read ATD = %d\n",n);
printf("read ATD =%s\n",string);
/* if(n < 0)
{
printf("send message error\n");
return -1;
}
printf("write message = %d\n",n);
printf("send end\n");
sleep(1);
close(fd);
*/
// pthread_mutex_unlock(&GPRS_lock);
/*sleep(2);
bzero(string,sizeof(string));
n = read(fd,string,100);
printf("read message %d\n",n);
printf("read message =%s\n",string);
*/
return 1;
}
FILE *fd;
/* int main(void)
{
//FILE *fd;
printf("11111111111\n");
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
printf("22222222222\n");
set_opt(fd,9600,8,0,0);
gprs(THIEF_INTO);
return 0;
}
*///测试代码
相关文章推荐
- 基本功练习_3_1_之(sim300 GPRS数据收发程序)
- 基本功练习_2_25_之大端(Big Endian)与小端(Little Endian)
- 【编程基本功练习0】zoj 3486
- 编程基本功训练:流程图画法及练习
- kernel基本功练习
- 编程基本功训练:流程图画法及练习
- 编程基本功训练:流程图画法及练习
- 基本功练习_2_14_冒泡法
- 基本功练习_2_19输入两个数求之间的能被3和5整除的数
- 基本功练习_2_26_之类型转换
- Java基本功练习五(一维数组相关操作[声明、创建、乱序、排序、查找]和方法的重载举例[浅议])
- Java基本功练习十八(异常处理【获取异常信息、链式异常和finally语句、自定制异常】)
- 基本功练习_2_15_比较交换法
- 基本功练习_2_27_之二分法查找
- 编程基本功训练:流程图画法及练习
- Java基本功练习十九(抽象类和接口【抽象类、接口(监听器、克隆、可比较)、包装类、有理数类实现】)
- 基本功练习:12月10日认识的弱点
- 【基本功练习_1】 HTML/DHTML
- 编程基本功训练:流程图画法及练习
- 编程基本功训练:流程图画法及练习