//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);
}