对GPRS驱动程序的修改

       之前网上找到的驱动,只能选择一项执行,不能满足系统模块的需要,我做了一些修改。增加了数据的存储空间,使得读回来的值再传递时,指针内容不会丢失或者出现段错误segment fault,这样的话,方便了其他函数的调用,由AT命令获取GPRS的sim卡IMSI信息、或者模块的其他可读信息,对于AT指令需要阅读相关的手册,一般GPRS模块的供应商会提供。

       我还有一个问题,串口发送了一个AT命令后,第二次发送则无效了,不知道是串口被占用了还是程序中没有对初始化的句柄释放,而且关闭时候会很久,现在还是个困惑。

以下函数功能:读取sim卡的IMSI,替换指令也可以做其他获取。

-------------------------------------------------------------------------------------------------------------------------------------------------

#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 <sys/select.h>  
#include <sys/time.h>  
#include <sys/types.h>   
  
#define DEVICE_TTYS  "/dev/ttyS1"
#define MAX_LEN_OF_SHORT_MESSAGE    140  

#define RECEIVE_BUF_WAIT_1S 2  


//------------------------------------- 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;  
    struct timeval tv;  
    int ret,pos;  
    tv.tv_sec = rcv_wait;   // wait 2.5s  
    tv.tv_usec = 0;  
    pos = 0; // point to rceeive buf  
    while (1)  
    {  
printf("----selector's fd=%d----\n",fd);
        FD_ZERO(&rfds);  //设置轮询的一些相关  clear terminal
        FD_SET(fd, &rfds);  //set terminal collection,add fd to collection
tv.tv_sec = rcv_wait;   // wait 2.5s  
    tv.tv_usec = 0; 
        retval = select(fd+1 , &rfds, NULL, NULL, &tv);  
printf("----retval=%d----\n",retval);
        if (retval == -1)   
        {  
                perror("select()");  
                break;  
        }  
        else if (retval)   
        {// pan duan shi fou hai you shu ju   
                ret = read(fd, rcv_buf+pos, 2048);  
                pos += ret;  
                if (rcv_buf[pos-2] == '\r' && rcv_buf[pos-1] == '\n')   //\r 表示回车的意思  
                {  
                        FD_ZERO(&rfds);  
                        FD_SET(fd, &rfds);  
                        retval = select(fd+1 , &rfds, NULL, NULL, &tv);  
                        if (!retval) break;// no datas, 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)  
{  
    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 ---------------------------------------  
char * GSM_GPRS_send_cmd_read_result(int fd, char *send_buf, int rcv_wait)  
{  
    char rcv_buf[2048];
    char *rcv = 0;
    rcv = new char[1024];
    if((send_buf==NULL) || (send_GSM_GPRS_cmd(fd,send_buf)))//判断send_buf是否为空或都发送过去的返来值是否为1  
    {   // send success , then read  
        bzero(rcv_buf,sizeof(rcv_buf));  
        if (read_GSM_GPRS_datas(fd,rcv_buf,rcv_wait))  
        {  
                printf ("------readbuf = %s-------\n",rcv_buf);
strncpy(rcv,rcv_buf,1024);
memset(rcv_buf,0,sizeof(rcv_buf));
}  
        else  
        {  
                printf ("read error\n");}  
    }  
    else  
    {  
        printf("write error\n");  
    }  
    //return rcv_buf;
    return rcv;
} // end GSM_GPRS_send_cmd_read_result  
  
//------------------------------------- send cmd : "at" to GSM/GPRS MODEM -----------------------------------  
//void GSM_read_IMSI(int fd)  
char * GSM_read_IMSI(int fd)  
{  
    char *send_buf="AT+CIMI\r";  
    return GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);  

//------------------------------------- init seriel port  ---------------------------------------------------  
void init_ttyS(int fd)  
{  
        struct termios options;   
        bzero(&options, sizeof(options));     
        cfsetispeed(&options,B115200);             
        cfsetospeed(&options,B115200);  
        options.c_cflag |= (CRTSCTS | CS8 | CLOCAL | CREAD);
        options.c_iflag = IGNPAR;
        tcflush(fd, TCIFLUSH); 
        tcsetattr(fd, TCSANOW, &options); 
}//end init_ttyS  
  
char * strCut(char *str)
{
      char *mystr=0;
      char digit[80];
      char *ps;
      int i=0;
      ps=str;
      while(*ps!='\0')
      {
        if(*ps>='0'&&*ps<='9')
        {
           digit[i]=*ps;    //找到数字,存放到数组digit里
           i++;
        }
        ps++;    //ps指针指向字符串下一个字符
      }
      digit[i]='\0';
      printf("digit=%s\n",digit);
      mystr = new char[1024];
      strncpy(mystr,digit,i);
      return mystr;
}
 
void  startPPP0()
{
printf("****************** start  ppp0 **********\n");
system("pppd file tdscdma.txt &");
printf("****************** end  ppp0 **********\n");
}
void  stopPPP0()
{
printf("****************** to stop  ppp0 **********\n");
system("pkill pppd");
printf("****************** stop  ppp0 **********\n");
}
char * readIMSI()  
{        
        int fd;  
char * IMSI=0;
char *mIMSI=0;
IMSI = new char[1024];
mIMSI = new char[1024];
        fd = open(DEVICE_TTYS, O_RDWR);
printf("***fd = %d\n",fd);
        if (fd == -1){printf("open device %s error\n",DEVICE_TTYS);}
        else{
init_ttyS(fd); 
strncpy(IMSI,GSM_read_IMSI(fd),1024);
printf("****IMSI=%s****\n",IMSI);
// mIMSI = new char[1024];
strncpy(mIMSI,strCut(IMSI),1024);
printf("****mIMSI0=%s****\n",mIMSI);
//strcpy(mIMSI,(char *)IMSI);
printf("start to closed fd ...\n");
if (close(fd)!=0) {printf("close device %s error\n",DEVICE_TTYS);}
else{printf("close device %s success\n",DEVICE_TTYS);}
}
printf("******mIMSI = %s*******\n",mIMSI);
return mIMSI;  

}

//------------------------- main ------------------------------------ 

int main()

{

//readIMSI()  ;

return 0;

}

//------------------------------------------------------------------------------------------------------------------------------------------ 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值