SIRF3代GPS模块和华为GTM900B GSM模块控制程序

来源:互联网 发布:怎么用淘宝格子铺 编辑:程序博客网 时间:2024/05/16 11:09

GPS模块:SIRF3

GSM模块:华为GTM900B

开发环境:LINUX


本篇博客的程序是在LINUX环境下把GPS模块接收到的卫星数据读取出来,并提取经纬度,利用gsm模块发送给服务器作为定位数据。


gps模块头文件gps.h

/*************************************************************************    > File Name: gps.h  > Author: kid  > Mail: 280197326@qq.com   > Created Time: 2014年03月27日 星期四 10时35分12秒 ************************************************************************/#ifndef __GPS_H__#define __GPS_H__#include <stdio.h>//标准io定义#include <fcntl.h>//文件控制定义#include <unistd.h>//unix标准函数定义#include <stdlib.h>//标准函数库定义#include <termios.h>//PPSIX终端控制定义#include <sys/types.h>#include <sys/time.h>//kill函数需要用到的头文件#include <signal.h>//kill函数需要用到的头文件#include <errno.h>//错误号定义#include <string.h>//字符串处理头文件int gps_open(char *device);//打开gps设备节点int gps_close(void);//关闭gps设备节点void gps_read(void);//读取gps模块int gps_set_serial(int fd, int speed, int bits, char event, int stop);//设置gps模块串口参数char *gps_data_analysis(void);//gps数据分析#endif


gps模块函数实现gps.c

/*************************************************************************    > File Name: gps.c  > Author: kid  > Mail: 280197326@qq.com   > Created Time: 2014年03月27日 星期四 09时27分23秒 ************************************************************************/#include "gps.h"#define uint unsigned int#define SIZE 1024int gps_fd;//gps设备文件描述符char* buf;//存放gps数据int gps_open(char *device)//打开gps设备节点{gps_fd = open (device, O_RDONLY);if( gps_fd==-1 ){perror("open gps error\n");return 1;}else{buf = malloc(SIZE);//分配buf内存空间if(buf == NULL){ close(gps_fd);return 1;}printf("open gps successfully\n");return 0;}}int gps_close(void)//关闭gps设备节点{int i = -1;free(buf);i = close(gps_fd);if( i!=0 ){perror("close gps fail\n");return 1;}else if( i==0 ){printf("close gps successfully\n");return 0;}}void gps_read(void)//读取gps数据{int i = -1;int j = -1;fd_set readfd;struct timeval timeout;FD_ZERO(&readfd);//初始化readfdFD_SET(gps_fd, &readfd);//把gps_fd加入readfdtimeout.tv_sec = 3;//设置3秒超时timeout.tv_usec = 0;j = select(gps_fd+1, &readfd, NULL, NULL, &timeout);//用select对gps_fd进行轮循if( j>0 ){if( FD_ISSET(gps_fd, &readfd) ){//如果gps_fd可读i = read(gps_fd, buf, SIZE);buf[i] = '\0';}}sleep(1);//等待1s,接受更多数据}int gps_set_serial(int fd, int speed, int bit, char event, int stop)//设置串口参数{int i = -1;int j = -1;struct termios serial;//串口类uint speed_in;//输入波特率uint speed_out;//输出波特率static uint speed_array[] = {0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200,230400};//如果不加static会出现重定义错误i = tcgetattr(fd, &serial);//用tcgetattr函数获取串口终端参数if( i!=0 ){perror("get gps serial data error\n");}else if( i==0 ){printf("get gps serial data successfully\n");}memset(&serial, 0, sizeof(struct termios));serial.c_cflag |= CLOCAL | CREAD;//设置数据接收器使能和本地模式serial.c_cflag &= ~CSIZE;//通过位掩码的方式激活switch( bit )//设置字符大小{case 8 : serial.c_cflag |= CS8; break;case 7 : serial.c_cflag |= CS7; break;}switch( speed )//设置波特率{case 2400 : cfsetispeed(&serial, B2400);cfsetospeed(&serial, B2400);break;case 4800 : cfsetispeed(&serial, B4800);cfsetospeed(&serial, B4800);break;case 9600 : cfsetispeed(&serial, B9600);cfsetospeed(&serial, B9600);break;case 115200 : cfsetispeed(&serial, B115200);  cfsetospeed(&serial, B115200);  break;}switch( event )//设置奇偶校验位{  case 'O' : //奇数   serial.c_cflag |= PARENB;   serial.c_cflag |= PARODD;   serial.c_iflag |= (INPCK | ISTRIP);   break;case 'E' : //偶数   serial.c_iflag |= (INPCK | ISTRIP);   serial.c_cflag |= PARENB;   serial.c_cflag &= ~PARODD;   break;case 'N' : //无奇偶校验位   serial.c_cflag &= ~PARENB;   break;}if( stop==1 ){//设置停止位serial.c_cflag &= ~CSTOPB;}else if( stop==2 ){serial.c_cflag |= CSTOPB;}serial.c_cc[VTIME] = 0;//设置等待时间serial.c_cc[VMIN] = 0;//设置最少接受字符tcflush(fd,TCIFLUSH);//用tcflush函数重置缓存j = tcsetattr(fd, TCSANOW, &serial);//用tcsetattr函数设置串口终端参数if( j!=0 ){perror("set gps serial data error\n");return 1;}else if( j==0 ){printf("set gps serial data successfully\n");speed_in = cfgetispeed(&serial);//获取输入波特率speed_out = cfgetospeed(&serial);//获取输出波特率printf("speed_in=%d, speed_out=%d, gps_fd=%d\n\n", speed_array[speed_in], speed_array[speed_out], fd);return 0;}}char *gps_data_analysis(void)//gps数据分析与处理函数{char *p = NULL;//strtok函数返回指针,以"$"分割int i = 1;char *sender[20];//保存$GPGGA数据gps_read();//读取gps数据p = strtok(buf, "$,");//把buf中的数据以"$,"为分隔符分割while(1){if( p==NULL ){//strtok函数会在最后返回一次NULL指针,所以需要判断然后跳出循环,否则会出现段错误break;}if( strcmp(p, "GPGGA")==0 ){//比较字符串,若p中的字符串为GPGGA则执行以下代码for(i=1; i<10; i++){p = strtok(NULL, "$,");//执行第一次strtok时需要写变量,之后调用strtok第一个变量填NULLsender[i] = p;//把p指针中的值保存在sender数组中if( sender[i]==NULL ){//同上出现NULL指针时跳出循环,否则出现段错误break;}}if( strcmp(sender[3], "N")==0 || strcmp(sender[3], "S")==0 ){//比较sender[3]中的字符串是否为N或S,若是则执行以下代码if( strcmp(sender[5], "E")==0 || strcmp(sender[5], "W")==0 ){//比较sender[5]中的字符串是否为E或W,若是则执行以下代码,两次if是为了确保经纬度数据正常才打印和发送printf("LATITUDE = %s\n", sender[2]);//打印纬度printf("N/S = %s\n", sender[3]);//打印南/北半球printf("LONGITUDE = %s\n", sender[4]);//打印经度printf("E/W = %s\n", sender[5]);//打印东/西半球printf("SATELLITE = %s\n\n", sender[7]);//打印使用卫星数量sprintf(sender[4], "%s,%s", sender[4], sender[2]);//合并经纬度保存到sender[4]中return sender[4];}}}p = strtok(NULL, "$,");//再次以"$,"分割buf中的数据,等于获取下一行数据}}



gsm模块头文件gsm.h

/*************************************************************************    > File Name: gsm.h  > Author: kid  > Mail: 280197326@qq.com   > Created Time: 2014年04月04日 星期五 10时50分14秒 ************************************************************************/#ifndef __gsm_h__#define __gsm_h__#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>#include <termios.h>#include <sys/time.h>#include <sys/select.h>int gsm_open(char *device);//打开gsm模块设备节点int gsm_close(void);//关闭gsm模块设备节点int gsm_set_serial(int fd, int speed, int bit, char event, int stop);//设置串口参数void gsm_read(void);//读取gsm模块信息void gsm_manufacturer(void);//查询模块制造商void gsm_model(void);//查询模块型号void gsm_version(void);//查询模块版本void gsm_number(void);//查询模块序列号void gsm_sim_number(void);//查询模块序列号void gsm_sim_exist(void);//确认sim卡是否存在void gsm_internet_choose(void);//选择无线网络void gsm_calling(void);//打电话void gsm_cut(void);//挂断电话void gsm_signal(void);//查询模块信号质量void gsm_sim_ready(void);//查询sim是否准备好void gsm_register(void);//查询是否注册成功void gsm_apn_set(void);//设置APN无线接入点void gsm_ppp_dialing(void);//进行ppp拨号,实现PDP激活和TCPIP的初始化void gsm_local_ip(void);//获取本地IP地址,以用DNS服务器地址void gsm_ip_open(void);//打开一条TCP或UDP连接void gsm_ip_get(void);//解析域名void gsm_data_send(char *p);//发送数据void gsm_ip_close(void);//关闭连接void gsm_iomode(void);//设置数据模式char *gsm_data_transfer(char *p);//转换发送数据为数据ascii码对应的十六进制数#endif


gsm模块函数实现gsm.c

/*************************************************************************    > File Name: gsm.c  > Author: kid  > Mail: 280197326@qq.com   > Created Time: 2014年04月04日 星期五 10时50分18秒 ************************************************************************/#include "gsm.h"int gsm_fd;//gsm模块句柄char a[100];//用于保存转码后的gps数据int gsm_open(char *device)//打开gsm模块设备节点{gsm_fd = open(device, O_RDWR);if( gsm_fd==-1 ){perror("open gsm error\n");return 1;//错误返回-1}else{printf("open gsm successfully\n");return 0;//正确返回0}}int gsm_close(void)//关闭gsm模块设备节点{int i = -1;i = close(gsm_fd);if( i==-1 ){perror("close gsm error\n");return 1;//错误返回-1}else if( i==0 ){printf("close gsm successfully\n");return 0;//正确返回0}}int gsm_set_serial(int fd, int speed, int bit, char event, int stop)//设置串口参数{int i = 0;int j = 0;struct termios serial;//串口参数类unsigned int speed_in;//输入波特率unsigned int speed_out;//输出波特率static unsigned int speed_array[] = {0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200,230400};//如果不加static会出现重定义错误i = tcgetattr(fd, &serial);//用tcgetattr函数获取串口终端参数if( i!=0 ){perror("get gsm serial data error\n");}else if( i==0 ){printf("get gsm serial data successfully\n");}memset(&serial, 0, sizeof(struct termios));serial.c_cflag |= CLOCAL | CREAD;//数据接收器使能和打开本地模式serial.c_cflag &= ~CSIZE;//通过位掩码的方式激活switch( speed )//设置波特率{case 0 : cfsetispeed(&serial, B0); cfsetospeed(&serial, B0); break;case 50 : cfsetispeed(&serial, B50);  cfsetospeed(&serial, B50);  break;case 75 : cfsetispeed(&serial, B75);  cfsetospeed(&serial, B75);  break;case 110 : cfsetispeed(&serial, B110);   cfsetospeed(&serial, B110);   break;case 134 : cfsetispeed(&serial, B134);   cfsetospeed(&serial, B134);   break;case 150 : cfsetispeed(&serial, B150);   cfsetospeed(&serial, B150);   break;case 200 : cfsetispeed(&serial, B200);   cfsetospeed(&serial, B200);   break;case 300 : cfsetispeed(&serial, B300);   cfsetospeed(&serial, B300);   break;case 600 : cfsetispeed(&serial, B600);   cfsetospeed(&serial, B600);   break;case 1200 : cfsetispeed(&serial, B1200);cfsetospeed(&serial, B1200);break;case 1800 : cfsetispeed(&serial, B1800);cfsetospeed(&serial, B1800);break;case 2400 : cfsetispeed(&serial, B2400);cfsetospeed(&serial, B2400);break;case 4800 : cfsetispeed(&serial, B4800);cfsetospeed(&serial, B4800);break;case 9600 : cfsetispeed(&serial, B9600);cfsetospeed(&serial, B9600);break;case 19200 : cfsetispeed(&serial, B19200); cfsetospeed(&serial, B19200); break;case 38400 : cfsetispeed(&serial, B38400); cfsetospeed(&serial, B38400); break;case 57600 : cfsetispeed(&serial, B57600); cfsetospeed(&serial, B57600); break;case 115200 : cfsetispeed(&serial, B115200);  cfsetospeed(&serial, B115200);  break;case 230400 : cfsetispeed(&serial, B230400);  cfsetospeed(&serial, B230400);  break;}switch( bit )//设置字符大小{case 8 : serial.c_cflag |= CS8;//8位 break;case 7 : serial.c_cflag |= CS7;//7位 break;}switch( event )//设置奇偶校验位{  case 'O' : //奇数   serial.c_cflag |= PARENB;   serial.c_cflag |= PARODD;   serial.c_iflag |= (INPCK | ISTRIP);   break;case 'E' : //偶数   serial.c_iflag |= (INPCK | ISTRIP);   serial.c_cflag |= PARENB;   serial.c_cflag &= ~PARODD;   break;case 'N' : //无奇偶校验位   serial.c_cflag &= ~PARENB;   break;}if( stop==1 ){//设置停止位serial.c_cflag &= ~CSTOPB;//1位}else if( stop==2 ){serial.c_cflag |= CSTOPB;//两位}serial.c_cc[VTIME] = 1;//设置等待时间,单位百毫秒,此处必须延时至少0.1秒,否则读取不到数据serial.c_cc[VMIN] = 128;//设置最少接受字符,单位字节,此处最少接受字节数必须大于接接收到的数据字节数tcflush(fd,TCIFLUSH);//用tcflush函数重置缓存j = tcsetattr(fd, TCSANOW, &serial);//用tcsetattr函数设置串口终端参数if( j!=0 ){perror("set gsm serial data error\n");return -1;}else if( j==0 ){printf("set gsm serial data successfully\n");speed_in = cfgetispeed(&serial);//获取输入波特率speed_out = cfgetospeed(&serial);//获取输出波特率printf("speed_in=%d, apeed_out=%d, gsm_fd=%d\n\n", speed_array[speed_in], speed_array[speed_out], fd);return 0;}}void gsm_read(void)//读取gsm模块信息{int i = -1;int j = -1;char r[128];fd_set readfd;struct timeval timeout;memset(r, 0, 128);//初始化数组FD_ZERO(&readfd);//初始化用于检查可读性的fd_setFD_SET(gsm_fd, &readfd);//把gsm模块fd加入监听行列timeout.tv_sec = 3;//设置3秒轮询timeout.tv_usec = 0;//i = select(gsm_fd+1, &readfd, NULL, NULL, &timeout);//select函数对行列中的fd轮询if( i>0 ){if( FD_ISSET(gsm_fd, &readfd) ){//当gsm模块fd可读j = read(gsm_fd, r, 128);}}printf("%s\n", r);}void gsm_manufacturer(void)//查询模块制造商{char w[128];int i = 0;strcpy(w, "at+cgmi\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGMI error\n");}gsm_read();sleep(1);}void gsm_model(void)//查询模块型号{char w[128];int i = 0;strcpy(w, "at+cgmm\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGMM error\n");}gsm_read();sleep(1);}void gsm_version(void)//查询模块版本{char w[128];int i = 0;strcpy(w, "at+cgmr\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGMR error\n");}gsm_read();sleep(1);}void gsm_number(void)//查询模块序列号{char w[128];int i = 0;sleep(1);strcpy(w, "at+cgsn\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGSN error\n");}gsm_read();sleep(1);}void gsm_sim_number(void)//查询sim卡序列号{char w[128];int i = 0;strcpy(w, "at+cimi\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CIMI error\n");}gsm_read();sleep(1);}void gsm_sim_exist(void)//确认sim卡是否存在{char w[128];int i = -1;strcpy(w , "at%tsim\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%TSIM error\n");}//printf("\nDESCRIPTION:\n%TSIM 0 没有检测到SIM卡\n%TSIM 1 检测到SIM卡\n");gsm_read();sleep(1);}void gsm_internet_choose(void)//选择无线网络{char w[128];int i = -1;strcpy(w , "at+ws46\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+WS46 error\n");}gsm_read();sleep(1);}void gsm_calling(void)//打电话{char w[128];int i = -1;strcpy(w , "atd15521219871;\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write ATD error\n");}gsm_read();sleep(1);}void gsm_cut(void)//挂断电话{char w[128];int i = -1;strcpy(w , "ATH\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write ATH error\n");}gsm_read();sleep(1);}void gsm_signal(void)//查询模块信号质量{char w[128];int i = -1;strcpy(w , "at+csq\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CSQ error\n");}//printf("\nDESCRIPTION : +CSQ: <rssi>,<ber>\n<rssi>\n0 小于等于-113dBm\n1 -111dBm\n2~30 -109~-53dBm\n31 大于等于-51dBm\n99 未知或不可测\n<ber>\n99 未知或不可测\n");gsm_read();sleep(1);}void gsm_sim_ready(void)//查询sim是否准备好{char w[128];int i = -1;strcpy(w , "at+cpin?\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CPIN? error\n");}gsm_read();sleep(1);}void gsm_register(void)//查询是否注册成功{char w[128];int i = -1;strcpy(w , "at+cgreg?\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGREG? error\n");}//printf("\nDESCRIPTION : +CGREG:<n>,<stat>\n<n>\n0 禁用网络注册非请求结果码+CGREG:\n1 启用网络注册非请求结果码\n2 启用网络注册和位置信息非请求结果码+CGREG:\n<stat>\n0 未注册;ME当前没有搜索注册业务的新运营商\n1 已注册,本网\n2 未注册,但 ME 正在搜索注册业务的新运营商\n3 注册被拒绝\n4 未知\n5 已注册,漫游\n");gsm_read();sleep(1);}void gsm_apn_set(void)//设置APN无线接入点{char w[128];int i = -1;strcpy(w , "at+cgdcont=1,\"IP\",\"CMNET\"\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT+CGDCONT error\n");}gsm_read();sleep(1);}void gsm_ppp_dialing(void)//进行ppp拨号,实现PDP激活和TCPIP的初始化{char w[128];int i = -1;strcpy(w , "at%etcpip=\"\",\"\"\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%ETCPIP error\n");}gsm_read();sleep(1);}void gsm_local_ip(void)//获取本地IP地址,以用DNS服务器地址{char w[128];int i = -1;strcpy(w , "at%etcpip?\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%ETCPIP? error\n");}//printf("\nDESCRIPTION : %ETCPIP:<state>[,[<local_ip>],[<gate>],[<DNS1>],[<DNS2>]]\n<state>\n0 TCPIP没有初始化\n1 TCPIP初始化完毕\n<local_ip> 本地 IP\n<gate> 网关\n<DNS1> 首选域名解析服务器\n<DNS2> 备用域名解析服务器\n");gsm_read();sleep(1);}void gsm_ip_open(void)//打开一条TCP或UDP链接{char w[128];int i = -1;strcpy(w , "at%ipopen=\"UDP\",\"58.215.187.74\",8000\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%IPOPEN error\n");}gsm_read();sleep(1);}void gsm_ip_get(void)//解析域名{char w[128];int i = -1;strcpy(w , "at%dnsr=\"zhangrunsheng.cn\"\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%DNSR error\n");}sleep(1);//需要延时一下,解析域名需要时间,否则返回ip不对gsm_read();sleep(1);}void gsm_data_send(char *p)//发送数据{char w[128];int i = -1;sprintf(w, "at%%ipsend=\"%s\"\r", p);i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%IPSEND error\n");}gsm_read();sleep(1);}void gsm_ip_close(void)//关闭连接{char w[128];int i = -1;strcpy(w , "at%ipclose=5\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%IPCLOSE error\n");}sleep(1);//需要延时一下,关闭连接需要时间gsm_read();sleep(1);}void gsm_iomode(void)//设置数据模式{char w[128];int i = -1;strcpy(w , "at%iomode=1,1,1\r");i = write(gsm_fd, w, strlen(w));if( i==-1 ){perror("write AT%IOMODE error\n");}gsm_read();sleep(1);}char *gsm_data_transfer(char *p)//转换发送数据为数据ascii码对应的十六进制数{unsigned int i = 0;char b[100];memset(a, 0, 100);memset(b, 0, 100);while( i<strlen(p) ){//对传入的gps数据进行转码switch( p[i] ){case ',' : strcpy(b, "2c");   sprintf(a, "%s%s", a, b);   break;case '.' : strcpy(b, "2e");   sprintf(a, "%s%s", a, b);   break;case '0' : strcpy(b, "30");   sprintf(a, "%s%s", a, b);   break;case '1' : strcpy(b, "31");   sprintf(a, "%s%s", a, b);   break;case '2' : strcpy(b, "32");   sprintf(a, "%s%s", a, b);   break;case '3' : strcpy(b, "33");   sprintf(a, "%s%s", a, b);   break;case '4' : strcpy(b, "34");   sprintf(a, "%s%s", a, b);   break;case '5' : strcpy(b, "35");   sprintf(a, "%s%s", a, b);   break;case '6' : strcpy(b, "36");   sprintf(a, "%s%s", a, b);   break;case '7' : strcpy(b, "37");   sprintf(a, "%s%s", a, b);   break;case '8' : strcpy(b, "38");   sprintf(a, "%s%s", a, b);   break;case '9' : strcpy(b, "39");   sprintf(a, "%s%s", a, b);   break;}i++;}return a;}



主函数main.c

/*************************************************************************    > File Name: main.c  > Author: kid  > Mail: 280197326@qq.com   > Created Time: 2014年03月27日 星期四 10时35分06秒 ************************************************************************/#include "gps.h"#include "gsm.h"int main(int argc, char *argv[]){int i = 0;char end[4];int pid = 0;char *p = NULL;extern int gps_fd;//在gps代码实现中已定义extern int gsm_fd;//在gsm代码实现中已定义if (argc != 3) {printf("error!!!usage: ./exe /dev/ttuUSB1(gps) /dev/ttyUSB2(gsm)\n");exit(1);}if( gps_open(argv[1])!=0 ){//打开gps设备节点exit(1);}if( gsm_open(argv[2])!=0 ){//打开gsm设备节点exit(1);}printf("\n");if( gps_set_serial(gps_fd, 4800, 8, 'N', 1)!=0 ){//设置gps模块串口参数exit(1);}if( gsm_set_serial(gsm_fd, 9600, 8, 'N', 1)!=0 ){//设置gsm模块串口参数exit(1);}pid = fork();//创建一条进程if( pid==-1 ){perror("error\n");}else if( pid==0 ){//子进程while(1){p = gps_data_analysis();//gps数据获取和分析if( p!=NULL ){p = gsm_data_transfer(p);//gsm数据转码gsm_apn_set();//设置APN无线接入点gsm_ppp_dialing();//进行ppp拨号,实现PDP激活和TCPIP的初始化gsm_ip_open();//打开一条TCP或UDP连接gsm_iomode();//设置数据模式gsm_data_send(p);//gsm数据发送gsm_ip_close();//关闭udp连接}usleep(100000);//延时100毫秒,等待线程调度,直接while(1)会导致卡死}}else if( pid>0 ){//父进程while(1){scanf("%s", end);if(strcmp(end, "end")==0){kill(pid, SIGSTOP);break;}}}if( gps_close()!=0 ){//关闭gps设备节点exit(1);}if( gsm_close()!=0 ){//关闭gsm设备节点exit(1);}return 0;}



0 0
原创粉丝点击