【物联网】SIM908/508 GPRS发送数据|送数据控制符|透明传输

目录

SIM908/508 GPRS发送数据中的控制符

sim300 GPRS数据收发程序

【GPRS透明传输】GPRS透明传输

GPRS应用中TCP与UDP的比较

【GPRS IP地址】GPRS IP地址的问题


SIM908/508 GPRS发送数据中的控制符

今天发送一组数据,发现数据每次都是只发送到一半,后面的数据都没有了,检查了一下发送出去的数据,和要待发的数据在哪个地方断开,发现是在0x19和0x1A处断开,所以0x19和0x1A是比较特殊的数值,经过比较,发现是0x1A导致的后面的数据丢失,0x1A 刚好是发送控制符,也就是数组中的0x1A导致了数据的提前发送,后面的数据就没发出去。去掉0x1A后,发现问题换成另一个问题,那就是,数据根本就没有发出去,后来了解得知,是0x1B的问题,0x1B刚好是模块的“退出”控制符,所以模块在接收到0x1B时,模块退出发送状态,导致数据无法发送出去。

   以前没有发现这个问题,是因为以前测试用的事变动的数据,数据一直在变动,所以导致一两条数据没有发出去,我们察觉不出来。

有人有相似的经验:

请教关于SIMCOM 的GPRS 模块,关于IP发送结束字符CTRL+Z的问题 - 捷配电子市场网

SIM908解决方式很简单,无需上面连接提到的方法,只需利用AT+CIPSEND 的length参数,控制发送的长度即可

,使用length 参数 还看免去 ctrl+z 这一步,非常方便。UESTC LCX 2012.3.25

AT+CIPSEND=length

例如:

AT+CIPSEND=9

AT+CIPSEND=09

AT+CIPSEND=009

以上等效。

sim300 GPRS数据收发程序

2011-05-21 11:41:39

原文地址:sim300 GPRS数据收发程序作者:半岛鱼

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;  
newtio.c_iflag &= ~INPCK;    
break;
case 'o':
case 'O':   
newtio.c_cflag |= (PARODD | PARENB);
newtio.c_iflag |= INPCK;            
break;
case 'e':
case 'E':
newtio.c_cflag |= PARENB;       
newtio.c_cflag &= ~PARODD;      
newtio.c_iflag |= INPCK;      
break;
case 'S':
case 's':
     newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;break;
default:
newtio.c_cflag &= ~PARENB;  
newtio.c_iflag &= ~INPCK;    
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=maxwaittime00*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]==' ')||
   }
   if(rc>0)
       no=no+1;
     len=len-1;
}
}
// printf("t buf=%cn",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=maxwaittime00*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("%dn",rc);
// printf("t buf=%cn",buf[no]);
// {
if((no>=2)&&(buf[no]=='#')) break; //(buf[no]==' ')||
// }
   if(rc>0)
      no=no+1;
     len=len-1;
}
}
// printf("t buf=%cn",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("%dn",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("%dn",strcmp(&buf[2],"SHUT OK"));
         return 0;
        }
       else
        return -1;
       break;
   case 4:
        if(strcmp(&buf[2],"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值