基本功练习_3_1_之(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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值