当前位置: 首页 > news >正文

[]sim300 GPRS数据收发程序

原文地址: 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],"CONNECT OK")==0)
        {
         printf("%dn",strcmp(&buf[2],"CONNECT OK"));
         return 0;
        }
       else
        return -1;
       break;
   case 5:
        if(strcmp(&buf[2],"> ")==0)
        {
         printf("%dn",strcmp(&buf[2],"> "));
         return 0;
        }
       else
        return -1;
       break;
   case 6:
        if(strcmp(&buf[2],"SEND OK")==0)
        {
         printf("%dn",strcmp(&buf[2],"SEND OK"));

相关文章:

  • []Telit UC864E 拨号上网
  • []常用AT命令解释()
  • []error LNK2001: unresolved external symbol _m
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • []我的函数库
  • 波分复用(WDM) 技术和概念
  • 2011年05月21日 男人成熟气质磨练
  • 【MSP430时钟】MSP430 5438时钟系统介绍
  • MSP 430 心得体会
  • MSP430X5XX的时钟系统与低功耗模式
  • MSP430:P1OUT=4、P1OUT |=4、P1OUT -=~8的意思
  • 【开关中断】MSP430 怎么开关中断,开关中断的代码|命令。
  • P3DIR|=BIT0、P3OUT=~BIT0  的含义
  • MSP430 5438 单片机学习笔记(鱼香茄子)
  • 6月2日 周四 晴   MSP430 5438 定时器A TIMER A 新认识
  • [deviceone开发]-do_Webview的基本示例
  • 【RocksDB】TransactionDB源码分析
  • Docker 笔记(2):Dockerfile
  • HTTP请求重发
  • JavaScript设计模式之工厂模式
  • js作用域和this的理解
  • k8s 面向应用开发者的基础命令
  • Vue ES6 Jade Scss Webpack Gulp
  • 对象管理器(defineProperty)学习笔记
  • 仿天猫超市收藏抛物线动画工具库
  • 简单基于spring的redis配置(单机和集群模式)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 主流的CSS水平和垂直居中技术大全
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #AngularJS#$sce.trustAsResourceUrl
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (27)4.8 习题课
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (五)c52学习之旅-静态数码管
  • (转载)虚函数剖析
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .gitignore文件设置了忽略但不生效
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 中的轻量级线程安全
  • .Net接口调试与案例
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET中 MVC 工厂模式浅析
  • .net中生成excel后调整宽度
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [1] 平面(Plane)图形的生成算法
  • [30期] 我的学习方法
  • [BJDCTF2020]The mystery of ip1
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [cb]UIGrid+UIStretch的自适应