sim300 GPRS数据收发程序

 

//int openport(char *Dev) //打开串口

//int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口,波特率,数据位,停止位,校验

//int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间

//int writeport(int fd,char *buf,int len)   //发送数据
//int modem_init(int fd)                    // modem设备的初始化
//int modem_send()                          //数据发送
#include   <stdio.h> 
#include   <string.h> 
#include   <unistd.h> 
#include   <fcntl.h> 
#include   <errno.h> 
#include   <termios.h> 
#include   <sys/time.h>
#include   <stdlib.h>

unsigned char rbuf[256],rbuf1[256];

int openport(char *Dev) 
 {
 int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
 if (-1 == fd)
 {   
  perror("Can''t Open Serial Port");
  return -1; 
 }
 else
  return fd;

 } 
  
int setport(int fd, int baud,int databits,int stopbits,int parity)
{
 int baudrate;
 struct   termios   newtio; 
 switch(baud)
 {
 case 300:
  baudrate=B300;
  break;
 case 600:
  baudrate=B600;
  break;
 case 1200:
  baudrate=B1200;
  break;
 case 2400:
  baudrate=B2400;
  break;
 case 4800:
  baudrate=B4800;
  break;
 case 9600:
  baudrate=B9600;
  break;
 case 19200:
  baudrate=B19200;
  break;
 case 38400:
  baudrate=B38400;
  break;
 default :
  baudrate=B9600; 
  break;
 }
 tcgetattr(fd,&newtio);   
 bzero(&newtio,sizeof(newtio)); 
   //setting   c_cflag
 newtio.c_cflag   &=~CSIZE;   
 switch (databits) /*设置数据位数*/
 { 
 case 7: 
  newtio.c_cflag |= CS7; //7位数据位
  break;
 case 8:   
  newtio.c_cflag |= CS8; //8位数据位
  break; 
 default:  
  newtio.c_cflag |= CS8;
  break;   
 }
 switch (parity) //设置校验
 { 
 case 'n':
 case 'N':  
  newtio.c_cflag &= ~PARENB;   /* Clear parity enable */
  newtio.c_iflag &= ~INPCK;     /* Enable parity checking */
  break;
 case 'o': 
 case 'O':   
  newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  newtio.c_iflag |= INPCK;             /* Disnable parity checking */
  break;
 case 'e':
 case 'E': 
  newtio.c_cflag |= PARENB;     /* Enable parity */  
  newtio.c_cflag &= ~PARODD;   /* 转换为偶效验*/   
  newtio.c_iflag |= INPCK;       /* Disnable parity checking */
  break;
 case 'S':
 case 's':  /*as no parity*/ 
     newtio.c_cflag &= ~PARENB;
  newtio.c_cflag &= ~CSTOPB;break;
 default: 
  newtio.c_cflag &= ~PARENB;   /* Clear parity enable */
  newtio.c_iflag &= ~INPCK;     /* Enable parity checking */
  break;  
 }
 switch (stopbits)//设置停止位
 { 
 case 1:  
  newtio.c_cflag &= ~CSTOPB;  //1
  break;
 case 2:  
  newtio.c_cflag |= CSTOPB;  //2
    break;
 default:
  newtio.c_cflag &= ~CSTOPB;
  break;
 }
 newtio.c_cc[VTIME] = 10;  
 newtio.c_cc[VMIN] = 0;
 newtio.c_cflag   |=   (CLOCAL|CREAD);
 newtio.c_oflag|=OPOST;
 newtio.c_iflag &=~(IXON|IXOFF|IXANY); 
             
    cfsetispeed(&newtio,baudrate); 
    cfsetospeed(&newtio,baudrate);
   //newtio.c_cflag &= ~CNEW_RTSCTS;
   newtio.c_lflag     &= ~(ICANON | ECHO | ECHOE | ISIG);
   newtio.c_oflag     &= ~OPOST;
    tcflush(fd,   TCIOFLUSH);
 if (tcsetattr(fd,TCSANOW,&newtio) != 0) 
 {
  perror("SetupSerial 3");
  return -1;
 }
 return 0;
}

int readport(int fd,unsigned char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
 int no=0;int rc;int rcnum=len;
 int gotend=0;
 struct timeval tv;
 fd_set readfd;
 tv.tv_sec=maxwaittime/1000;    //SECOND
 tv.tv_usec=maxwaittime%1000*1000;  //USECOND
 FD_ZERO(&readfd);
 FD_SET(fd,&readfd);
 rc=select(fd+1,&readfd,NULL,NULL,&tv);
 if(rc>0)
 {
  //while(len)
  {
   while(!gotend)
   {
   rc=read(fd,&buf[no],1);
  
   if(no>=2)
   {
    if(((buf[no]==0x0A)&&(buf[no-1]==0x0D))||(buf[no]=='#')||((buf[no-1]=='>')&&(buf[no]==0x20))) gotend=1;  //(buf[no]=='/0')||
   }
   if(rc>0)
      no=no+1;
     len=len-1;
   }
   
  }
 // printf("/t buf=%c/n",buf[2]);
  if(no!=rcnum)
   return no;        //如果收到的长度与期望长度不一样,返回-1
  return rcnum;      //收到长度与期望长度一样,返回长度
 }

 return -1;
}

//csshixia
#if 0
int readport_1(int fd,unsigned char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
 int no=0;int rc;int rcnum=len;
 int gotend=0;
 struct timeval tv;
 fd_set readfd;
 tv.tv_sec=maxwaittime/1000;    //SECOND
 tv.tv_usec=maxwaittime%1000*1000;  //USECOND
 FD_ZERO(&readfd);
 FD_SET(fd,&readfd);
 rc=select(fd+1,&readfd,NULL,NULL,&tv);
 if(rc>0)
 {
  while(len)
  {
   //while(!gotend)
   {
   rc=read(fd,&buf[no],1);
   //printf("%d/n",rc);
  // printf("/t buf=%c/n",buf[no]);
  // {
  if((no>=2)&&(buf[no]=='#')) break;  //(buf[no]=='/0')||
  // }
   if(rc>0)
     no=no+1;
     len=len-1;
   }
   
  }
 // printf("/t buf=%c/n",buf[2]);
  if(no!=rcnum)
   return no;        //如果收到的长度与期望长度不一样,返回
  return rcnum;      //收到长度与期望长度一样,返回长度
 }

 return -1;
}
#endif
//ceshi
int writeport(int fd,unsigned char *buf,int len)  //发送数据
{
 write(fd,buf,len);
}

void clearport(int fd)      //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
{
 tcflush(fd,TCIOFLUSH);
}

int check_recv(unsigned char *buf,int sno)
{
  switch(sno)
   {
    case 0:
    case 1: 
    case 3:
    
      if(strcmp(&buf[2],"OK")==0)
       {
        printf("%d/n",strcmp(&buf[2],"OK"));
        return 0;
       }
      else
        return -1;
        //if(strcmp(buf,"ERROR")==0
        break;
   case 2:
        if(strcmp(&buf[2],"SHUT OK")==0)
       {
        printf("%d/n",strcmp(&buf[2],"SHUT OK"));
        return 0;
       }
      else
        return -1;
       break;
   case 4:
        if(strcmp(&buf[2],"CONNECT OK")==0)
       {
        printf("%d/n",strcmp(&buf[2],"CONNECT OK"));
        return 0;
       }
      else
        return -1;
       break;
   case 5:
        if(strcmp(&buf[2],"> ")==0)
       {
        printf("%d/n",strcmp(&buf[2],"> "));
        return 0;
       }
      else
        return -1;
       break;
   case 6:
        if(strcmp(&buf[2],"SEND OK")==0)
       {
        printf("%d/n",strcmp(&buf[2],"SEND OK"));
        return 0;
       }
      else
        return -1;
       break;
   case 7:
        if(strcmp(&buf[2],"STATE: CONNECT OK")==0)
       {
        printf("%d/n",strcmp(&buf[2],"STATE: CONNECT OK"));
        return 0;
       }
      else
        return -1;
       break;
  default :
    return  -1;
   }

}
int modem_init( int fd)
{
 int rc=-1,i=5;
 
CHK:  writeport(fd,"AT/r",strlen("AT/r")+1);
      printf("send:AT/n");
      rc=readport(fd,rbuf,32,10000);
      rbuf[rc-2]='/0';
     
      if(check_recv(rbuf,0)!=0)
      {
       printf("There is something wrong:%s",rbuf);
       while(i--)
       {
        usleep(200000);
         goto CHK;
        }
       printf("连接失败 请检查设备/n");
       exit(0);
      }
     
      else 
      printf("recv:%s/n",rbuf);
     
  if(rc>0)                   //modem处于连接状态
  {
  
   writeport(fd,"ATE0/r",strlen("ATE0/r")+1);
   printf("send:ATE0/n");
   rc=readport(fd,rbuf,32,10000);
   rbuf[rc-2]='/0';
    if(check_recv(rbuf,1)!=0)
      {
       printf("send:ATE0:%s",rbuf);
       return 0;
       //goto CHK;
      }
   else 
      return 1;
   }
  }
 
int modem_shut(int fd)
 {
   int rc=0;
   writeport(fd,"AT+CIPSHUT/r",strlen("AT+CIPSHUT/r")+1);
   printf("send:AT+CIPSHUT/n");
   rc=readport(fd,rbuf,32,10000);
   rbuf[rc-2]='/0';
    if(check_recv(rbuf,2)!=0)
      {
       printf("send:AT+CIPSHUT %s !ERROR!",rbuf);
       return 0;
       //goto CHK;
      }
    else 
     return 1;
    
 }
int modem_connect(int fd,unsigned char *sbuf,unsigned char *sbuf1)
 {
   int rc;
  
   writeport(fd,sbuf,strlen(sbuf)+1);
   printf("send:%s/n",sbuf);
   rc=readport(fd,rbuf,32,10000);
   rbuf[rc-2]='/0';
    if(check_recv(rbuf,3)!=0)
      {
       printf("send:AT+CGDCONT=1,/"IP/",/"CMNET/":%s/n",rbuf);
       //goto CHK;
       //return 0;
      }
  
      printf("recv:%s/n",rbuf);
    
   writeport(fd,sbuf1,strlen(sbuf1)+1);   //发送ip地址连接网络
   printf("send:%s/n",sbuf1);
   rc=readport(fd,rbuf,32,20000);         //等待接收OK
   rbuf[rc]='/0';
   printf("recvnum:%d/n",rc);
  
   printf("recv:%s/n",rbuf);
   rc=readport(fd,rbuf,32,20000);         // 等待接收+pdp
   rbuf[rc]='/0';
   printf("recvnum:%d/n",rc);
  
   printf("recv:%s/n",rbuf);
   rc=readport(fd,rbuf,32,30000);        //等待 CONNECT OK
   rbuf[rc-2]='/0';
    if(check_recv(rbuf,4)!=0)
      {
       printf("send:AT+CIPSTART=/"TCP/",/"IP/",/"7777/"/r:%s/n",rbuf);
       //goto CHK;
       return 0;
      }
    else 
      return 1;
 }
 
 int modem_send(int fd,unsigned char datasend[1024])
 {
      int rc,len;
      unsigned char datasend_1[1024];
    
      writeport(fd,"AT+CIPSEND/r",strlen("AT+CIPSEND/r")+1);  //发送at+cipsend
     printf("AT+CIPSEND/n");
     rc=readport(fd,rbuf,32,10000);   //等待读取返回 >
     rbuf[rc]='/0';
     if(check_recv(rbuf,5)!=0)        //  判断是否收到>
      {
       printf("send:AT+CIPSTART=/"TCP/",/"IP/",/"7777/"/r:%s/n",rbuf);
       //goto CHK;
       return 0;
      }
           
     printf("Needed >:%s/t",rbuf);

   // printf("Input data :/n");
    //  usleep(200000);
    //  tcflush(fd,TCIOFLUSH);
    //  usleep(200000);
    //  fgets(fsend1,1024,stdin);
  
     sprintf(datasend_1,"%s%c",datasend,0x1a);
      len=  strlen(datasend_1);  
      writeport(fd,datasend_1,len+2);
      
   //usleep(200000);
   //clearport(fd);
   //tcflush(fd,TCOFLUSH);
      rc=readport(fd,rbuf,32,20000); 
      rbuf[rc-2]='/0';
     if(check_recv(rbuf,6)!=0)        //  判断是否收到>
      {
       printf("数据发送失败:%s/n",rbuf);
       //goto CHK;
       return 0;
      }
      printf("Needed Send OK:-----%s-----/n",rbuf1);
      return 1; 
 }
 
int modem_status(int fd)
{
 int rc;
 writeport(fd,"AT+CIPSTATUS/r/n",strlen("AT+CIPSTATUS/r/n")+1);  //发送at+cipsend   
  rc=readport(fd,rbuf,32,10000);
  rbuf[rc-2]='/0';
  if(check_recv(rbuf,0)!=0)        //  判断是否收到>
      {
       printf("状态查询指令发送失败:%s/n",rbuf);
       //goto CHK;
       return 0;
      }
  printf("is ok data recv:%x %x/n",rbuf[0],rbuf[1]);
        
  rc=readport(fd,rbuf,32,10000);
  rbuf[rc-2]='/0';
  if(check_recv(rbuf,7)!=0)        //  判断是否收到>
      {
       printf("modem没有连接:%s/n",rbuf);
       //goto CHK;
       return 0;
      }
   return 1;
 
}
 
main() 

 int   fd,rc,i=3,j,ret; 
 
 unsigned char wbuf[256]="AT+CGDCONT=1,/"IP/",/"CMNET/"/r";
 unsigned char wbuf1[256]="AT%CGPCO=1,/"PAP, , /",1/r";
 unsigned char wbuf2[256]="AT+CIPSTART=/"TCP/",/"117.10.20.52/",/"7777/"/r";
 unsigned char fsend[1024];
 unsigned char fsend1[1024];

// memset(fsend, 0x0, sizeof(fsend));
// memset(rbuf1, 0x0, sizeof(rbuf1));
 

 char *dev ="/dev/ttyS0";    //串口号 /dev/ttyS0  对应于串口1
    fd  =  openport(dev);    //打开串口
 if(fd>0)
 {
  ret=setport(fd,4800,8,1,'s');  //设置串口,波特率,数据位,停止位,校验
  if(ret<0)
  {
   printf("Can't Set Serial Port!/n");
   exit(0);
  }
 }
 else
 {
  printf("Can't Open Serial Port!/n");
  exit(0);
 }
// 开始执行AT命令

  rc=modem_init(fd);                                            //初始化判断
  if(rc>0)
   printf("The modem has been connected to the Serial Port/n");
  else
   printf("There is no modem detected/n");
   
  rc=modem_status(fd);                                          //modem状态查询
   if(rc>0)
   printf("modem already connectting successfully:%s /n",rbuf);
    else
      {
        printf("modem NOT connectting:%s/n",rbuf);
                     
      rc=modem_connect(fd,wbuf,wbuf2);                              //使用IP地址连接网络
      printf("%d",rc);
    if(rc>0)
      printf("The modem has been successfully connected /n");
     else
      printf("The modem connectting ERROR!!!!!!!!!!/n");
      
        }
  
   tcflush(fd,TCIOFLUSH);
 
   strcpy(fsend,"987654321#");
   rc=modem_send(fd,fsend);                                      //发送数据
   if(rc>0)
   printf("Data successfully send /n");
   else
   printf("Data  send  ERROR!!!!!!!!!!/n");
    
   rc=readport(fd,rbuf1,32,10000);
   //printf("recvnum:%d/n",rc);
   rbuf1[0]=' ';
   rbuf1[rc]='/0';
   printf("data recv:%s/t",rbuf1);
   printf("......................................................./n");
  
 /*       rc=modem_shut(fd);                                             //关闭连接
      if(rc>0)
      printf("The modem connectting is shut successfully/n");
     else
      printf("The modem connectting is shut ERROR!!!!!!!!!!/n");
  
  */
  rc=modem_status(fd);
   if(rc>0)
   printf("modem already connectting successfully:%s /n",rbuf);
    else
   printf("modem NOT connectting:%s/n",rbuf);
            
 close(fd); 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值