基于BBB的4轮移动轮式机器人系统设计与实现(八)-- SIM908 GPS 数据获取

在对SIM908GPS开发板应用的过程中,主要涉及到的就是串口的操作及其GPs数据的解析过滤等

GPS串口类定义与实现


#ifndef GPSSERIALCOM_H
#define GPSSERIALCOM_H
#include<iostream>
#include <fcntl.h>
#include"SerialCom.h"
using namespace std;
#define GPSDEBUG ;
class GpsSerialCom :public  SerialCom
{
    public:
                 GpsSerialCom();
                ~GpsSerialCom();
    public:
               bool            GpsSerialComOpenSet(const char *pComDeviceName ,const int &iSpeed, const int &iBits, const char &cEvent, const int &iStop);
               bool            GpsSerialComClose();
               bool            GpsSerialComDataRead();
               const std::string &GetGpsPackData()const{ return m_strPackData;}
               const int&        GetGpsPackDataLen()const{ return m_iPackDataLen;}
   private:
                bool             GpsDataAnalyze();                         //无参数的 GPS 数据 解析  经度 维度  海拔 等
                bool             GpsLongitudeTurn();                   //经度数据处理
                bool             GpsLatitudeTurn();                   //纬度数据处理
                bool             GpsAltitudeTurn();                 //海拔数据处理
                bool             GpsSpeedTurn();                  //物体速度数据处理
                bool             GpsTimeTurn();               //北京时间解析处理
                const std::string PackGpsData();
                const char*       FindTimeCharInString(const char*pNeedSerachCharString,const char &cNeedSearchChar, const int &iNeedSearchNum);
    private:
                int               m_iGpsComFd;
                char              *m_pGpsData;                        // GPS 读取到全部数据数据
                int                m_iGpsDataLength;                 //  GPS

                char               *m_pEinfo;                             // 东经
                double              m_dEinfo;
                std::string         m_strEinfo;

                char                  *m_pNinfo;                        // 北纬
                double                 m_dNinfo;
                std::string            m_strNinfo;

                char                   *m_pAltitudeInfo;            //海拔高度
                double                  m_dAltitudeInfo;
                std::string             m_strAltitudeInfo;

                char                   *m_pSpeedInfo;               //速度
                double                  m_dSpeedInfo;
                std::string             m_strSpeedInfo;

                char                    *m_pDegreesInfo;               //方向角度
                double                   m_dDegreesInfo;
                std::string              m_strDegreesInfo;

                char                    *m_pTime;                         //UTC时间  +8就是 北京时间了
                std::string              m_strTime;
                std::string 			   m_strPackData; 	 //打包GPS数据
                int                      m_iPackDataLen;
};
#endif // GPSSERIALCOM_H


#include <unistd.h>
#include <string.h>
#include <stdlib.h>   //atof
#include <stdio.h>   //sprint
#include<termios.h>
#include"GpsSerialCom.h"
#include "GraduationCommon.h"
/************************************/
          //构造函数
/************************************/
GpsSerialCom::GpsSerialCom()
{
    m_pGpsData  = new char[1026] ;                             // GPS 读取到全部数据数据
    m_iGpsDataLength  = 1024;                                   //GPS  Length
    m_pEinfo  = new char[15];   ;                               // 东经
    m_dEinfo = 0.0;
    m_dNinfo= 0.0;
    m_iPackDataLen = 0;
    m_iGpsComFd = 0;
    m_dSpeedInfo = 0;
    m_dAltitudeInfo = 0;
    m_dDegreesInfo= 0;
    m_pNinfo = new char[15] ;                                // 北纬
    m_pAltitudeInfo = new char [5];                     //海拔高度
    m_pSpeedInfo  = new char[6];                       //速度
    m_pDegreesInfo = new char[4];                   //方向角度
    m_pTime = new char[12];                            //UTC时间  +8就是 北京时间了

}
/**********************************/
       // 析够函数
/**********************************/
GpsSerialCom::~GpsSerialCom()
{
    delete []m_pGpsData ;                             // GPS 读取到全部数据数据
    delete []m_pEinfo  ;                             // 东经
    delete []m_pNinfo ;                             // 北纬
    delete []m_pAltitudeInfo;                      //海拔高度
    delete []m_pSpeedInfo ;                       //速度
    delete []m_pDegreesInfo ;                    //方向角度
    delete []m_pTime;                          //UTC时间  +8就是 北京时间了
}
/***********************************/
//   GPS  Com Open  And Set
/***********************************/
bool  GpsSerialCom::GpsSerialComOpenSet(const char *pComDeviceName ,const int &iSpeed, const int &iBits, const char &cEvent, const int &iStop)
{
    m_iGpsComFd = SerialComOpen(pComDeviceName); //return com fd
    if(m_iGpsComFd  <  0){
           std::cout<<" Sorry ! Sfe1012 Gan Not Open GPS Serial Com! "<<std::endl;
           return false;
    }
    if(!SerialComInit(m_iGpsComFd,iSpeed, iBits, cEvent, iStop)){
        std::cout<<"Sorry! Sfe1012  Can  Not  Init The GPS Serial Com"<<std::endl;
        return false;
    }
    return true;
}
/**********************************/
    // Close GPS Com
/**********************************/
bool GpsSerialCom::GpsSerialComClose()
{
    if(close(m_iGpsComFd) < 0)
        return false;

    return true;
}
/**********************************/
       //GPS 数据获取
/**********************************/
 bool  GpsSerialCom::GpsSerialComDataRead()
 {
	int GetBytesOk=0;
	int iGet = 0;
	tcflush(m_iGpsComFd, TCIFLUSH);
	memset(m_pGpsData,0,1026);
	while(GetBytesOk<1024)
	{
	if ((iGet = SerialComRead(m_iGpsComFd, m_pGpsData+GetBytesOk,1024 -GetBytesOk)) == -1)
			 {
				 perror("send");
				 exit(1);
			 }
			 GetBytesOk+=iGet;
	}
	*(m_pGpsData+GetBytesOk )  =  '\0';
	if ( GetBytesOk  >  0){
	#ifdef  GPSDEBUG
	 std::cout<<"GPS Data Len="<<GetBytesOk<<std::endl;
	 std::cout<<"GPS Data: "<<m_pGpsData<<std::endl;
	#endif
	}else{
	std::cout<<"Sorry Sfe1012  Have No GPS  Data"<<std::endl;
	return  false;
	}
	if(!GpsDataAnalyze())
	{
		std::cout<<"Fuck Not Good Data"<<std::endl;
		return false;
	}
//	 memset(m_pGpsData,0,1026);
//    int   iReadNum  =  SerialComRead(  m_iGpsComFd ,  m_pGpsData ,  m_iGpsDataLength);
//    *(m_pGpsData+iReadNum )  =  '\0';
//    if ( iReadNum  >  0){
//        #ifdef  GPSDEBUG
//         std::cout<<"GPS Data Len="<<iReadNum<<std::endl;
//         std::cout<<"GPS Data: "<<m_pGpsData<<std::endl;
//        #endif
//    }else{
//        std::cout<<"Sorry Sfe1012  Have No GPS  Data"<<std::endl;
//        return  false;
//     }
//    GpsDataAnalyze();
    return true;
 }
 /**********************************/
        //自定义的字符串操作函数
        //在一个字符窜中找到给定字符c,
        //和出现次数n,返回这个字符的位置
 /**********************************/
 const char *GpsSerialCom::FindTimeCharInString(const char*pNeedSerachCharString,const char &cNeedSearchChar, const int &iNeedSearchNum)
 {
      const char  *pSerachCharPosition = pNeedSerachCharString;
      int              iCountNum = 0;
      while( iCountNum  !=  iNeedSearchNum){
        if(*pSerachCharPosition == cNeedSearchChar){
               iCountNum ++;
               pSerachCharPosition++;
           }else
            pSerachCharPosition++;
      }
      pSerachCharPosition --;    //指向查找的字符
      return pSerachCharPosition;
 }
/**********************************/
                   //GPS 数据 解析
/**********************************/
bool  GpsSerialCom::GpsDataAnalyze()
{
    unsigned int   iGpsDataLen;
    string strInPut=m_pGpsData;
    string::size_type  iGpgga,iGpgll,iGpvtg,iGpzda;
    iGpgga=strInPut.find("GPGGA",0);
    if(iGpgga == string::npos )
    {
    	return false;
    }
    iGpgll= strInPut.find("GPGLL",iGpgga);
    if(iGpgll == string ::npos )
    {
    	return false;
    }
    iGpvtg=strInPut.find("GPVTG",iGpgll);
    if(iGpvtg == string::npos )
    {
    	return false;
    }
    iGpzda=strInPut.find("GPGGA",iGpvtg);
    if(iGpzda == string::npos )
    {
    	return false;
    }
    const  char *pSonString, *pNeedSerachChar;   //  子串   和  需要查找的的字符
    iGpsDataLen = strlen(m_pGpsData);  // strlen 返回的大小是数组实际的大小
    if(iGpsDataLen>0){
          pSonString = strstr((const char *)m_pGpsData, (const char *)"$GPGGA");
          if(  NULL != pSonString ){
                /*解析UTC时间*/
                pNeedSerachChar  =  NULL;
                pNeedSerachChar  =  FindTimeCharInString(pSonString,  ',' , 1);
                if(NULL != pNeedSerachChar){
                    pNeedSerachChar++;
                    int i;
                    for(i=0; *pNeedSerachChar != ','; i++){
                        m_pTime[i] = *pNeedSerachChar;
                        pNeedSerachChar++;
                    }
                    m_pTime[i]='\0';
                }
                std::cout<<"时间:"<<m_pTime<<std::endl;
                /* 解析东经*/
                pNeedSerachChar = NULL;
                pNeedSerachChar =FindTimeCharInString(pSonString, ',', 4);
                if(NULL != pNeedSerachChar){
                    pNeedSerachChar++;
                    int i=0;
                    for(i=0; *pNeedSerachChar != ','; i++){
                        m_pEinfo[i] = *pNeedSerachChar; //+2
                        pNeedSerachChar++;
                    }
                    m_pEinfo[i]='\0';//2
                }
                #ifdef GPSDEBUG
                std::cout<<"东经:"<<m_pEinfo<<std::endl;
                #endif
                /* 解析东经 */
                pNeedSerachChar = NULL;
                pNeedSerachChar =FindTimeCharInString(pSonString, ',', 2);
                if(NULL != pNeedSerachChar){
                    pNeedSerachChar++;
                    int i=0;
                    for(i=0; *pNeedSerachChar != ','; i++){
                        m_pNinfo[i] = *(pNeedSerachChar++);
                    }
                    m_pNinfo[i]='\0';
                }
                #ifdef GPSDEBUG
                std::cout<<"北纬:"<<m_pNinfo<<std::endl;
                #endif
                /* 解析海拔高度 */
                pNeedSerachChar = NULL;
                pNeedSerachChar =FindTimeCharInString(pSonString, ',', 9);
                if(NULL != pNeedSerachChar){
                    pNeedSerachChar++;
                    int i=0;
                    for(i=0; *pNeedSerachChar != ','; i++){
                        //只取前面4个值
                        m_pAltitudeInfo[i] = *(pNeedSerachChar++);
                    }
                    m_pAltitudeInfo[i]='\0';
                }
                 #ifdef GPSDEBUG
                std::cout<<"海拔高的:"<<m_pAltitudeInfo<<std::endl;
                #endif
        }
/***********************************$GPVTG******************************************/
        pSonString = strstr(m_pGpsData, "$GPVTG");
        if(NULL != pSonString){
            /* 解析方向角度 */
            pNeedSerachChar = NULL;
            pNeedSerachChar =FindTimeCharInString(pSonString, ',', 1);
            if(NULL != pNeedSerachChar){
                pNeedSerachChar++;
                int i=0;
                for(i=0; *pNeedSerachChar != ','; i++){
                    m_pDegreesInfo[i] = *pNeedSerachChar;
                    pNeedSerachChar++;
                }
                m_pDegreesInfo[i]='\0';
                #ifdef GPSDEBUG
                std::cout<<"方向角度"<<m_pDegreesInfo<<std::endl;
                #endif
            }
            /* 解析速度 */
            pNeedSerachChar = NULL;
            pNeedSerachChar =FindTimeCharInString(pSonString, ',', 5);
            if(NULL != pNeedSerachChar){
                pNeedSerachChar++;
                int i=0;
                for(i=0; i<5; i++){
                    m_pSpeedInfo[i] = *(pNeedSerachChar++);
                }
                m_pSpeedInfo[i]='\0';
                #ifdef GPSDEBUG
               std::cout<<"速度"<<m_pSpeedInfo<<std::endl;
               #endif
            }
        }
       memset(m_pGpsData, 0,strlen(m_pGpsData));  //sizeof 返回的大小是 数组的大小
   }
    if(!GpsLongitudeTurn())                   //经度数据处理
    {return false;}
    if(!GpsLatitudeTurn())                   //纬度数据处理
    {return false;}
    if(!GpsAltitudeTurn())                 //海拔数据处理
    {return false;}
    if(!GpsSpeedTurn())                  //物体速度数据处理
    {return false;}
    if(!GpsTimeTurn())                //北京时间解析处理
    {return false;}
    PackGpsData();
    return true;
}
/***********************************************/
   //纬度数据处理 纬度范围  北纬90 0  南纬 90
/***********************************************/
bool GpsSerialCom::GpsLatitudeTurn()
{
    #ifdef GPSDEBUG
    std::cout<<"纬度转换"<<std::endl;
    #endif
    char  End_char[15];			  //这个作为最终的char
    std::string End_String;	     //要返回的最终结果
    double End_Double;		    //这里存放最终的double
    //需要转换的数组前两位为整数部分
    char    zs_char[3];  		  //整数部分
    double  zs_double;		 //证书部分转换为 double
    std::string  zs_string;
    zs_char[0]=*m_pNinfo;
    zs_char[1]=*(m_pNinfo+1);
    zs_char[2]='\0';
    zs_string = zs_char;
    zs_double = atof(zs_string.c_str());
    #ifdef GPSDEBUG
    std::cout<<"zs_double:"<<zs_double<<std::endl;
    #endif
    //需要转换的小数部分
    char * xs_char;
    std::string xs_string;
    double xs_double;
    xs_char = m_pNinfo+2;
    xs_string = xs_char;
    xs_double = atof(xs_string.c_str());
    #ifdef GPSDEBUG
    std::cout<<"xs_double:"<<xs_double<<std::endl;
    std::cout<<"xs_string:"<<xs_string<<std::endl;
    #endif
    xs_double = xs_double/60;
    #ifdef GPSDEBUG
    std::cout<<"xs_double:"<<xs_double<<std::endl;
    #endif
    //整数和小数合并
    End_Double=zs_double+xs_double;
    #ifdef GPSDEBUG
    std::cout<<"End_Double:"<<End_Double<<std::endl;
    #endif
    sprintf(End_char,"%.8lf",End_Double);
    End_String = End_char;
    m_dNinfo = End_Double;
    m_strNinfo = End_String;
    #ifdef  GPSDEBUG
    std::cout<<"GPS_Ninfo_Double:"<<m_dNinfo<<std::endl;
    std::cout<<"GPS_Ninfo_String:"<<m_strNinfo<<std::endl;
    std::cout<<"End_char:"<<End_char<<std::endl;
    std::cout<<"End_String:"<<End_String<<std::endl;
    #endif
    return true;
}
/**********************************************/
  //经度数据处理 经度范围 东京 180  0   西经 180
/**********************************************/
bool   GpsSerialCom::GpsLongitudeTurn()
{
    #ifdef GPSDEBUG
    std::cout<<"经度转换"<<std::endl;
    #endif
    char  End_char[15];			       //这个作为最终的char
    std::string End_String;	          //要返回的最终结果
    double End_Double;		         //这里存放最终的double
    //需要转换的数组前两位为整数部分
    char    zs_char[5];  		 //整数部分
    double  zs_double;		//证书部分转换为 double
    std::string  zs_string;
    zs_char[0]=*m_pEinfo;
    zs_char[1]=*(m_pEinfo+1);
    zs_char[2]=*(m_pEinfo+2);
    zs_char[3]='\0';
    zs_string = zs_char;
    zs_double=atof(zs_string.c_str());
    #ifdef GPSDEBUG
    std::cout<<"zs_double:"<<zs_double<<std::endl;
    #endif
    //需要转换的小数部分
    char * xs_char;
    std::string xs_string;
    double xs_double;
    xs_char=m_pEinfo+3;
    xs_string=xs_char;
    xs_double=atof(xs_string.c_str());
    #ifdef GPSDEBUG
    std::cout<<"xs_double:"<<xs_double<<std::endl;
    std::cout<<"xs_string:"<<xs_string<<std::endl;
    #endif
    xs_double=xs_double/60;
    #ifdef GPSDEBUG
    std::cout<<"xs_double:"<<xs_double<<std::endl;
    #endif
    //整数和小数合并
    End_Double=zs_double+xs_double;
    #ifdef GPSDEBUG
    std::cout<<"End_Double:"<<End_Double<<std::endl;
    #endif
    sprintf(End_char,"%.8lf",End_Double);
    End_String=End_char;
    m_dEinfo = End_Double;
    m_strEinfo = End_String;
    #ifdef GPSDEBUG
    std::cout<<"m_pEinfo_Double:"<<m_dEinfo<<std::endl;
    std::cout<<"m_pEinfo_String:"<<m_strEinfo<<std::endl;
    std::cout<<"End_char:"<<End_char<<std::endl;
    std::cout<<"End_String:"<<End_String<<std::endl;
    #endif
    return true;
}
bool  GpsSerialCom::GpsAltitudeTurn()            //海拔数据处理
{
    #ifdef GPSDEBUG
    std::cout<<"海拔转换"<<std::endl;
    #endif
    double       zs_double;		//整数部分转换为 double
    std::string  zs_string;
    zs_string = m_pAltitudeInfo;
    zs_double=atof(zs_string.c_str());
    m_dAltitudeInfo = zs_double;
    m_strAltitudeInfo = zs_string;
    #ifdef GPSDEBUG
    std::cout<<"Altitude_Info_Double:"<<m_dAltitudeInfo<<std::endl;
    std::cout<<"Altitude_Info_String:"<<m_strAltitudeInfo<<std::endl;
    #endif
    return true;
}
bool GpsSerialCom::GpsSpeedTurn()              //物体速度数据处理
{
    #ifdef GPSDEBUG
    std::cout<<"速度转换"<<std::endl;
    #endif
    double        zs_double;		//证书部分转换为 double
    std::string   zs_string;
    zs_string = m_pSpeedInfo;
    zs_double=atof(zs_string.c_str());
    m_dSpeedInfo = zs_double;
    m_strSpeedInfo = zs_string;
    #ifdef GPSDEBUG
    std::cout<<"Speed_Info_Double :"<<m_dSpeedInfo<<std::endl;
    std::cout<<"Speed_Info_String :"<<m_strSpeedInfo<<std::endl;
    #endif
    return true;
}
bool GpsSerialCom::GpsTimeTurn()//北京时间解析处理
{
     #ifdef GPSDEBUG
    std::cout<<"时间转换:"<<std::endl;
    #endif
    #ifdef GPSDEBUG
    int mun = strlen(m_pTime);
    std::cout<<"mun:"<<mun<<std::endl;
    #endif
    if( (strlen(m_pTime)) > 0){
    //091827
    char  gps_time[15];
    char  gps_time_mm[10];
    char  gps_time_hour_8[8];
    char  gps_time_hour[3];
    gps_time_hour[0]=*m_pTime;
    gps_time_hour[1]=*(m_pTime+1);
    gps_time_hour[2]='\0';
    std::string  zs_string;
    int  zs_int;
    zs_string=gps_time_hour;
    zs_int=atoi(zs_string.c_str());
    #ifdef GPSDEBUG
    std::cout<<"zs_int:"<<zs_int<<std::endl;
    #endif
    zs_int=zs_int+8;  //中国为东8区
    #ifdef GPSDEBUG
    std::cout<<"zs_int:"<<zs_int<<std::endl;
    #endif
    sprintf(gps_time_hour_8,"%d",zs_int);
    gps_time_mm[0]=':';
    gps_time_mm[1]=*(m_pTime+2);
    gps_time_mm[2]=*(m_pTime+3);
    gps_time_mm[3]=':';
    gps_time_mm[4]=*(m_pTime+4);
    gps_time_mm[5]=*(m_pTime+5);
    gps_time_mm[6]='\0';
    memset(gps_time,0,strlen(gps_time));
    strcat(gps_time,gps_time_hour_8);
    strcat(gps_time,gps_time_mm);
    m_strTime = gps_time;
    #ifdef GPSDEBUG
    std::cout<<"GPS_Time:"<<m_strTime<<std::endl;
    #endif
    }
    return true;
}
const std::string GpsSerialCom::PackGpsData()
{
   m_strPackData.clear();
   std::string strPackData = "E" + m_strEinfo
    		          + "N"+ m_strNinfo
    		          + "A"+ m_strAltitudeInfo
    		          + "S" + m_strSpeedInfo
    		          + "D" + m_strDegreesInfo
    		          + "T" + m_strTime;
   m_strPackData = GraduationCommon::IntToString(strPackData.size()) + strPackData;
    m_iPackDataLen = m_strPackData.size();
	return  m_strPackData;
}

GraduationCommon类定义与实现  这里面主要是数据的转换方法

/*
 * GraduationCommon.h
 *
 *  Created on: 2014-9-11
 *      Author: root
 */
#ifndef GRADUATIONCOMMON_H_
#define GRADUATIONCOMMON_H_
typedef std::string	SFEString;
class GraduationCommon{
   public:
          static SFEString ShortToString(const short &i);
          static SFEString UnCharToString(const unsigned char &type);
          static SFEString UnIntToString(const unsigned int &iIput);
          static SFEString IntToString(const int &iIput);
          static int       StringToInt(const SFEString &stInput);
};


#endif /* GRADUATIONCOMMON_H_ */

/*
 * GraduationCommon.cpp
 *
 *  Created on: 2014-9-11
 *      Author: root
 */
#include <sstream>
#include "GraduationCommon.h"
SFEString GraduationCommon::ShortToString(const short &i)
{
  SFEString strValue ;
  std::stringstream stream;
  stream << i;
  stream >> strValue;
  return strValue;
}
SFEString GraduationCommon::UnCharToString(const unsigned char &type)
{
  SFEString strValue ;
  std::stringstream stream;
  stream << type;
  stream >> strValue;
  return strValue;
}
SFEString GraduationCommon::UnIntToString(const unsigned int &iIput)
{
    SFEString strValue ;
    std::stringstream stream;
    stream << iIput;
    stream >> strValue;
    return strValue;
}
SFEString GraduationCommon::IntToString(const int &iIput)
{
    SFEString strValue ;
    std::stringstream stream;
    stream << iIput;
    stream >> strValue;
    return strValue;
}
int GraduationCommon::StringToInt(const SFEString &stInput)
{
    int  iValue ;
    std::stringstream stream;
    stream << stInput;
    stream >> iValue;
    return iValue;
}


GSM类的定义与实现   SIM908中GSM串口 是整个模块的控制端口


#ifndef GSMSERIALCOM_H
#define GSMSERIALCOM_H
#include"SerialCom.h"
class GsmSerialCom : public SerialCom
{
    public:
           typedef struct
           {
                char RemoteIP[16];
                char RemotePort[5];
                char TransferMode[4];
                char APN[10];
           }stNetWorkConfig;
    public:
            GsmSerialCom(){m_iGsmComFd = 0;};
    public:
            bool GsmSerialComOpenSet(const char *pComDeviceName ,const int &iSpeed, const int &iBits, const char &cEvent, const int &iStop);
            bool GsmSerialComClose();
            bool GpsFucntionInit();//开启GPS 功能
            bool GprsFunctionInit();//开启GPRS功能
            bool GprsLinkConnect(const stNetWorkConfig *pstNetWorkConfig);
            bool GprsDataSend(const char*pGprsData,const int &iGprsDataLen);
    private:
            int m_iGsmComFd;    //Gsm Com Fd

};
#endif // GSMSERIALCOM_H


#include<unistd.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include"Sim908Command.h"
#include"GsmSerialCom.h"
/***********************************/
//   Gsm Com Open And Set
/***********************************/
bool  GsmSerialCom::GsmSerialComOpenSet(const char *pComDeviceName ,const int &iSpeed, const int &iBits, const char &cEvent, const int &iStop)
{
    m_iGsmComFd = SerialComOpen(pComDeviceName); //return com fd
    if(m_iGsmComFd  <  0){
           std::cout<<" Sorry ! Sfe1012 Gan Not Open GPS Serial Com! "<<std::endl;
           return false;
    }
    if(!SerialComInit(m_iGsmComFd,iSpeed, iBits, cEvent, iStop)){
        std::cout<<"Sorry! Sfe1012  Can  Not  Init The GPS Serial Com"<<std::endl;
        return false;
    }
    return true;
}
/**********************************/
    // Close Gsm Com
/**********************************/
bool GsmSerialCom::GsmSerialComClose()
{
    if(close(m_iGsmComFd) < 0)
        return false;

    return true;
}
/***************************************/
       // 打开  GPS  功能
/**************************************/
bool GsmSerialCom::GpsFucntionInit()
{
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CGPSPWR,strlen(AT_CGPSPWR)))
    {
        std::cout<<"ERROR GSP_Command 1"<<std::endl;
        return false;
    }
    else
    {
        std::cout<<"GSP_Command 1 OK!"<<std::endl;
    }
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CGPSRST,strlen(AT_CGPSRST)))
    {
        std::cout<<"ERROR GSP_Command 2"<<std::endl;
        return false;
    }
    else
    {
        std::cout<<"GSP_Command 2 OK!"<<std::endl;
    }
    return true;
}
/***************************************/
       // 打开  GPRS  功能
/**************************************/
bool GsmSerialCom::GprsFunctionInit()   //GPRS  Init
{
    //显示接收数据IP 头
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CIPHEAD,strlen(AT_CIPHEAD)))
    {
        std::cout<<"ERROR GPRS_Command 1"<<std::endl;
        return false;
    }
    else
    {
        std::cout<<"GPRS_Command 1 OK!"<<std::endl;
    }
    //选择快发模式或者普通模式
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CIPQSEND,strlen(AT_CIPQSEND)))
    {
        std::cout<<"ERROR GPRS_Command 2"<<std::endl;
        return false;
    }
    else
    {
         std::cout<<"GPRS_Command 2 OK!"<<std::endl;
    }
    //发送数据时显示>和send ok//发送数据时显示>和send ok
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CIPSPRT,strlen(AT_CIPSPRT)))
    {
         std::cout<<"ERROR GPRS_Command 3"<<std::endl;
         return false;
    }
    else
    {
        std::cout<<"GPRS_Command 3 OK!"<<std::endl;
    }
     //设置APN
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CSTT,strlen(AT_CSTT)))
    {
         std::cout<<"ERROR GPRS_Command 4"<<std::endl;
         return false;
    }
    else
    {
        std::cout<<"GPRS_Command 4 OK!"<<std::endl;
    }
    //激活移动场景
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CIICR,strlen(AT_CIICR)))
    {
       std::cout<<"ERROR GPRS_Command 5"<<std::endl;
        return false;
    }
    else
    {
        std::cout<<"GPRS_Command 5 OK!"<<std::endl;
    }
    //设置为透传模式
    if(!SerialComWriteCommond(m_iGsmComFd,AT_CIPMODE,strlen(AT_CIPMODE)))
    {
        std::cout<<"ERROR GPRS_Command 6"<<std::endl;
        return false;
    }
    else
    {
        std::cout<<"GPRS_Command 6 OK!"<<std::endl;
    }

    return true;
}
/*****************************************/
              //创建 GPRS 链接
/*****************************************/
bool GsmSerialCom::GprsLinkConnect(const stNetWorkConfig *pstNetWorkConfig)
{
    stNetWorkConfig netcfg = *pstNetWorkConfig;
    static char *pcmdbuf = NULL;
    pcmdbuf = new char [strlen(AT_CIPSTART)];
    if(pcmdbuf == NULL)
    {
        return false;
    }
    sprintf(pcmdbuf, AT_CIPSTART, netcfg.TransferMode, netcfg.RemoteIP, netcfg.RemotePort);
    if(!SerialComWriteCommond(m_iGsmComFd,pcmdbuf,strlen(AT_CIPSTART)))
    {
        delete []pcmdbuf;
        return true;
    }
    return true;
}
/***************************************/
       //Gprs 数据发送
/**************************************/
bool  GsmSerialCom::GprsDataSend(const char*pGprsData,const int &iGprsDataLen)  //发送数据  基本就是  写串口
{
    unsigned int cmdLen;
    if(1 == SerialComWriteCommond(m_iGsmComFd,AT_CIPSEND,strlen(AT_CIPSEND)))
    {
        if(!SerialComWrite(m_iGsmComFd,pGprsData,iGprsDataLen))
        {
            perror("Gprs Write Data Error ");
            return false;
        }
        cmdLen = 1;
        if(!SerialComWrite(m_iGsmComFd,"\x1A",cmdLen))
        {
            perror("Gprs Write Data End Symbol Error ");
            return false;
        }
    }
    return true;
}

SIM908命令字


#ifndef SIM908_COMMAND_H
#define SIM908_COMMAND_H

const char AT_Cmd[]     =   "AT\r";
const char AT_OK[]      =   "OK";
const char ATI_Cmd[]    =   "ATI\r";
const char ATE0_Cmd[]   =   "ATE0\r";
const char AT_CSQ[]     =   "AT+CSQ\r";
const char AT_CPIN[]    =   "AT+CPIN?\r";
const char AT_COPS[]    =   "AT+COPS?\r";
const char ATD_Cmd[]    =   "ATD%s;\r"; 									 //最大支持20位电话号码
const char AT_CPBS[]    =   "AT+CPBS=\"SM\"\r";                       //设置选择SIM通讯录
const char AT_CPBR[]    =   "AT+CPBR=%d\r";                             //读取SIM卡中的号码
const char ATD_n[]      =   "ATD>%d;\r";
const char AT_CLCC[]    =   "AT+CLCC\r";
const char ATH_Cmd[]    =   "ATH\r";
const char ATA_Cmd[]    =   "ATA\r";
const char AT_CIPHEAD[]	=   "AT+CIPHEAD=1\r";
const char AT_CIPSRIP[] =   "AT+CIPSRIP=1\r";
const char AT_CIPQSEND[]=   "AT+CIPQSEND=0\r";
const char AT_CIPSPRT[] =   "AT+CIPSPRT=1\r";
const char AT_CSTT[]  	=   "AT+CSTT=\"CMNET\"\r";
const char AT_CIICR[]    = 	"AT+CIICR\r";
const char AT_CIPMODE[]  = 	"AT+CIPMODE=1\r";
const char AT_CIPSTART[]  =  "AT+CIPSTART=\"%s\",\"%s\",%s\r";
const char AT_CIPSEND[]   =  "AT+CIPSEND\r";
const char AT_CIPSTATUS[] =  "AT+CIPSTATUS\r";
const char AT_CIPCLOSE[]  =		"AT+CIPCLOSE=1\r";
const char AT_CIPSHUT[]   =		"AT+CIPSHUT\r";
const char AT_CCLK[]		 =		"AT+CCLK?\r";
const char AT_CCLKSet[]	 =		"AT+CCLK=\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d+%d%d\"\r";
const char AT_CMGF[]     = 	  "AT+CMGF=%d\r";
const char AT_CMGS[]     = 	  "AT+CMGS=\"%s\"\r";
const char AT_CMGSPDU[]  = 	  "AT+CMGS=%d\r";
const char AT_CGPSPWR[]	=		"AT+CGPSPWR=1\r";
const char AT_CGPSRST[]	=		"AT+CGPSRST=1\r";
const char AT_CBC[] 		=		"AT+CBC\r";

#endif // SIM908_COMMAND_H

调用方法


//============================================================================
// Name        : GpsGsm.cpp
// Author      : sfe1012
// Version     : v_0.1.0
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include "GsmSerialCom.h"
#include "GpsSerialCom.h"
#include "ComDevice.h"
#include "GraduationCommon.h"
#include "Tcp.h"


#include<time.h>     //C语言的头文件
#include<stdio.h>     //C语言的I/O
#include<unistd.h>
#include<string>
#include<stdlib.h>
using namespace std;

int main() {
	cout << "!!!PandaBoard Gps!!!" << endl; // prints !!!Hello World!!!
	//Tcp
//	MyTcpServer oMyTcpServer;
//	oMyTcpServer.ServerControl(4331);
	//Gps
	GsmSerialCom oGsmSerialCom;
	GpsSerialCom oGpsSerialCom;
	oGsmSerialCom.GsmSerialComOpenSet(Com_Usb_Device_0,115200,8,'N',1);
	oGpsSerialCom.GpsSerialComOpenSet(Com_Usb_Device_1,115200,8,'N',1);
	oGsmSerialCom.GpsFucntionInit();
	while(1)
	{
		oGpsSerialCom.GpsSerialComDataRead();
		std::cout<<"Send To PC"<<"PackData:"<<oGpsSerialCom.GetGpsPackData()<<std::endl;

		//oMyTcpServer.ServerSend(oGpsSerialCom.GetGpsPackData().c_str(),oGpsSerialCom.GetGpsPackDataLen());
	}
	return 0;
}


资源http://download.csdn.net/detail/sfe1012/8629779


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值