⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sim300 gprs数据收发程序.txt

📁 gprs数据收发程序用于使用sim300进行数据传输的收发子程序
💻 TXT
字号:
//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);  

}  
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -