之前网上找到的驱动,只能选择一项执行,不能满足系统模块的需要,我做了一些修改。增加了数据的存储空间,使得读回来的值再传递时,指针内容不会丢失或者出现段错误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
// 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;
}
//------------------------------------------------------------------------------------------------------------------------------------------