2012年(12)
分类: 嵌入式
2012-05-07 15:39:58
今天来使用上一次gprs AT命令来上网做一个实例
同样用的是qben M23的gprs模块
这是在上次界面改进的,只是界面没有美观优化(界面是用QCreate绘制的)
同样gprs模块是通过串口通信的,首先设置串口
下面实现代码
首先是main.cpp文件
#include
#include
int main( int argc, char **argv )
{
QApplication App( argc, argv );
GprsClient Gprs;
Gprs.show();
return App.exec();
}
下面是gprsclient.h文件
#ifndef GPRSCLIENT_H
#define GPRSCLIENT_H
#include
#include
#include
#include
#include
#include
#include
namespace Ui {
class GprsClient;
}
class GprsClient : public QWidget
{
Q_OBJECT
public:
explicit GprsClient(QWidget *parent = 0);
~GprsClient();
QTimer *timer;
void SetSerialPort();
void SetBaudRate();
void SetDataBit();
void SetStopBit();
void SetCheckOut();
bool setSerial(int fd,int BaudRate, int DataBit, int CheckOut, int StopBit);
bool OpenPort();
int SetConnectGprs(char buf_ip[]);
private slots:
virtual void ChangeSerialPort();
virtual void ChangeBaudRate();
virtual void ChangeDataBit();
virtual void ChangeStopBit();
virtual void ChangeCheckOut();
virtual void GprsConnect();
virtual void SendMsg();
virtual void RecvMsg();
private:
Ui::GprsClient *ui;
int SerialPort;
int DataBit;
int BaudRate;
int StopBit;
int CheckOut;
int SerialFd;
bool OpenFlag;
};
#endif // GPRSCLIENT_H
下面是gprsclient.cpp
#include "gprsclient.h"
#include "ui_gprsclient.h"
#include
GprsClient::GprsClient(QWidget *parent) :
QWidget(parent),
ui(new Ui::GprsClient),
SerialPort(0),
DataBit(0),
BaudRate(0),
StopBit(0),
CheckOut(0),
SerialFd(-1),
OpenFlag(true)
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));
ui->setupUi(this);
timer = new QTimer();
SetSerialPort(); //添加设置串口号
SetBaudRate(); //添加设置波特率
SetDataBit(); //添加设置数据位
SetStopBit(); //添加设置停止位
SetCheckOut(); //添加设置校验位
connect(ui->SerialPortBox,SIGNAL(currentIndexChanged(int)),\
this,SLOT(ChangeSerialPort()));
connect(ui->BaudRateBox,SIGNAL(currentIndexChanged(int)),\
this,SLOT(ChangeBaudRate()));
connect(ui->DataBitBox,SIGNAL(currentIndexChanged(int)),\
this,SLOT(ChangeDataBit()));
connect(ui->StopBitBox,SIGNAL(currentIndexChanged(int)),\
this,SLOT(ChangeStopBit()));
connect(ui->CheckOutBox,SIGNAL(currentIndexChanged(int)),\
this,SLOT(ChangeCheckOut()));
connect(ui->ConnectServerButton,SIGNAL(clicked()),this,SLOT(GprsConnect()));
connect(ui->SendButton, SIGNAL( clicked() ), this, SLOT( SendMsg() ));
connect(timer,SIGNAL(timeout()),this,SLOT(RecvMsg()));
}
GprsClient::~GprsClient()
{
delete ui;
}
void GprsClient::SetSerialPort()
{
ui->SerialPortBox->addItem("PC_COM_0");
ui->SerialPortBox->addItem("PC_COM_1");
ui->SerialPortBox->addItem("ARM_COM_0");
ui->SerialPortBox->addItem("ARM_COM_1");
ui->SerialPortBox->addItem("ARM_COM_2");
}
void GprsClient::SetBaudRate()
{
ui->BaudRateBox->addItem("4800");
ui->BaudRateBox->addItem("9600");
ui->BaudRateBox->addItem("115200");
}
void GprsClient::SetDataBit()
{
ui->DataBitBox->addItem("7");
ui->DataBitBox->addItem("8");
}
void GprsClient::SetStopBit()
{
ui->StopBitBox->addItem("1");
ui->StopBitBox->addItem("2");
}
void GprsClient::SetCheckOut()
{
ui->CheckOutBox->addItem(tr("无校验"));
ui->CheckOutBox->addItem(tr("偶校验"));
ui->CheckOutBox->addItem(tr("奇校验"));
}
void GprsClient::ChangeSerialPort()
{
/*0->pc-0,1->pc-1,2->arm-0,3->arm-1,4->arm-2*/
SerialPort = ui->SerialPortBox->currentIndex();//取当前串口号的box下标
}
void GprsClient::ChangeBaudRate()
{
/*0->4800,1->9600,2->115200*/
BaudRate = ui->BaudRateBox->currentIndex();//取当前波特率的box下标
}
void GprsClient::ChangeDataBit()
{
/*0->7bit,1->7bit*/
DataBit = ui->DataBitBox->currentIndex();//取当前数据位的box下标
}
void GprsClient::ChangeStopBit()
{
/*0->1bit,1->2bit*/
StopBit = ui->StopBitBox->currentIndex();//取当前停止位的box下标
}
void GprsClient::ChangeCheckOut()
{
/*0->无校验,1->偶校验,2->奇校验*/
CheckOut = ui->CheckOutBox->currentIndex();//取当前校验的box下标
}
/**********************************************************************
**function: GprsConnect()连接gprs服务器
**parameters: SerialFd,BaudRate,DataBit,CheckOut,StopBit
**return value: NUll
**time: 2011-12-25 01:37
**author: tiydy
**********************************************************************/
void GprsClient::GprsConnect()
{
char NetRcvBuf[300];
if( OpenFlag )
{
bool OpenSerialFlag;
OpenSerialFlag = OpenPort();
if( !OpenSerialFlag )
{
perror("com open error");
return ;
}
OpenSerialFlag = setSerial(SerialFd, BaudRate, DataBit, CheckOut, StopBit);
if( !OpenSerialFlag )
{
perror("com set error");
return ;
}
if( ui->ServerIpLine->text().isEmpty() || \
ui->PortNumberLine->text().isEmpty()||\
ui->UserNameLine->text().isEmpty())
{
QMessageBox::warning(this, tr("warning"), tr("pleace input server ip!"),0,0);
return ;
}
/*设置ip跟网络:AT$DESTINFO="192.168.0.1",'1',8010这里的ip和端口号是服务器的*/
QString IpSet = "AT$DESTINFO=\""+ui->ServerIpLine->text()\
+'"'+','+'1'+','+ui->PortNumberLine->text();
//用命令设置gprs模块上网
SetConnectGprs(IpSet.toAscii().data());
//把自己的名称发送到服务器
QString name(ui->UserNameLine->text());
int netw = write(SerialFd,name.toAscii().constData(),name.length());
if( (netw < 0) )
{
perror("write error");
return ;
}
//清除串口缓存
tcflush(SerialFd,TCIOFLUSH);
sleep(1);
//读取服务器返回来的信息
int netr = read(SerialFd,NetRcvBuf,300);
if( (netr < 0) )
{
perror("Read error");
return ;
}
if((strstr(NetRcvBuf,"CONNECT")))
{
ui->StatLabel->setText(tr("已连接"));
OpenFlag = false;
timer->start( 1000 );
}
else
{
QMessageBox::warning(this, tr("warning"), tr("connect error plase ag"), 0, 0);
return ;
}
}
else
{
timer->stop();
OpenFlag = true;
::close( SerialFd );
ui->StatLabel->setText(tr("未连接"));
}
}
/**********************************************************************
**function: SendMsg()发送数据
**parameters: void
**return value: NUll
**time: 2011-12-25 01:37
**author: tiydy
**********************************************************************/
void GprsClient::SendMsg()
{
if( ui->SendMsgText->toPlainText().isEmpty() )
{
QMessageBox::warning(this, tr("warning"), tr("msg is empty!"), 0, 0);
return ;
}
//用户名
//接收用户
//发送信息内容
QString str = ui->UserNameLine->text()+':'+\
ui->RecvNameLine->text()+':'+\
ui->SendMsgText->toPlainText();
char sendBuf[300];
strcpy(sendBuf, str.toAscii().constData() );
::write(SerialFd,sendBuf,300);
ui->SendMsgText->clear();
ui->RecvMsgList->addItem( str );
}
void GprsClient::RecvMsg()
{
char recvBuf[200];
int ret = read(SerialFd,recvBuf,200);
if( ret == 0 )
{
perror("recv error");
return ;
}
QString str( recvBuf );
ui->RecvMsgList->addItem(str);
}
/**********************************************************************
**function: setSerial(int fd,int BaudRate, int DataBit, int CheckOut, int StopBit)设置串口
**parameters: newtio,oldtio
**return value: if ok return true else false
**time: 2011-12-25 01:37
**author: tiydy
**********************************************************************/
bool GprsClient::setSerial(int fd,int BaudRate, int DataBit, int CheckOut, int StopBit)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0) {
perror("SetupSerial 1");
return false;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( BaudRate )
{
case 0://波特率为4800
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 1://波特率为9600
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 2://波特率为115200
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
switch( DataBit )
{
case 0://数据位为7位
newtio.c_cflag |= CS7;
break;
case 1://数据位为8位
newtio.c_cflag |= CS8;
break;
}
switch( CheckOut )
{
case 0 ://无校验
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 1 ://偶校验
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 2 ://奇校验
newtio.c_cflag &= ~PARENB;
break;
}
switch( StopBit )
{
case 0: //一位停止位
newtio.c_cflag &= ~CSTOPB;
break;
case 1: //两位停止位
newtio.c_cflag |= CSTOPB;
break;
default : break ;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return false;
}
return true;
}
/**********************************************************************
**function: OpenPort()打开串口
**parameters: SerialPort
**return value: if ok return true else false
**time: 2011-12-25 01:37
**author: tiydy
**********************************************************************/
bool GprsClient::OpenPort()
{
switch( SerialPort )
{
case 0 :
SerialFd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
break;
case 1 :
SerialFd = open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY);
break;
case 2 :
SerialFd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
break;
case 3 :
SerialFd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
break;
case 4 :
SerialFd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
break;
default : SerialFd = -1;
break;
}
if( SerialFd < 0 )
{
perror("com open error");
return false;
}
return true;
}
int GprsClient::SetConnectGprs(char buf_ip[])
{
char data1[50];//="AT+CGDCONT=1,\"IP\",\"CMNET\"\r";
char data2[50];//="AT%CGPCO=1,\"PAP,,\",1\r";
char data3[20];//="AT$NOSLEEP=1\r";
char data4[20];//="AT+CNMI=2,1,,1\r";
char data5[20];//="ATD*97#\r";
int tmp=0;
strcpy(data1,"AT+CGDCONT=1,\"IP\",\"CMNET\"\r");
tmp=write(SerialFd,data1,strlen(data1));
if(tmp==-1)
return 1;
else
printf("cmnet successed\n");
sleep(1);
strcpy(data2,"AT%CGPCO=1,\"PAP,,\",1\r");
tmp=write(SerialFd,data2,strlen(data2));
if(tmp==-1)
return 1;
else
printf("pap successed\n");
sleep(1);
strcpy(data3,"AT$NOSLEEP=1\r");
tmp=write(SerialFd,data3,strlen(data3));
if(tmp==-1)
return 1;
else
printf("nosleep successed\n");
sleep(1);
strcpy(data4,"AT+CNMI=2,1,,1\r");
tmp=write(SerialFd,data4,strlen(data4));
if(tmp==-1)
return 1;
else
printf("sms successed\n");
sleep(1);
tmp=strlen(buf_ip);
buf_ip[tmp]='\r';
tmp=write(SerialFd,buf_ip,strlen(buf_ip));
if(tmp==-1)
return 1;
else
printf("IP PORT successed\n");
sleep(1);
strcpy(data5,"ATD*97#\r");
tmp=write(SerialFd,data5,strlen(data5));
if(tmp==-1)
return 1;
else
printf("*97# successed\n");
sleep(1);
return 0;
}
下面是工程文件GprsClient.pro
HEADERS += \
gprsclient.h
SOURCES += \
gprsclient.cpp \
main.cpp
FORMS += \
gprsclient.ui
用QCreate制作一个gprsclient.ui的界面文件(qt4平台)
把上述文件放到Liunx下的一个目录下设置好qt4的平台,再执行qmake,make就ok运行了
具体说明可以看下上期文档和这里代码注释
了解更多请关注:
粤嵌教育:
粤嵌新浪微博:
粤嵌腾讯微博: