在对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