- 论坛徽章:
- 0
|
使用QT作主界面,通过串口操作GPRS实现打电话,发短信
//首先解决串口操作的问题
#ifndef UARTIO_H
#define UARTIO_H
int open_uart(char *fname);
int set_uart_speed(int fd, int speed);
int set_uart_parity(int fd, int databits, int stopbits, int parity);
ssize_t read_uart_timeout(int fd, void *buf, size_t count, int timeout);
#endif
#include //串口头文件
#include
#include
#include
#include
int __speed_table[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,};
int __name_table[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,};
//打开串口函数,参数为一串口设备文件名
int open_uart(char *fname)
{
struct termios term_opt;
int fd;
fd=open(fname,O_RDWR|O_NOCTTY);
if (fd == -1) return -1;
bzero(&term_opt, sizeof(struct termios));
//defalut settings
cfmakeraw(&term_opt);
term_opt.c_cc[VTIME] = 0;
term_opt.c_cc[VMIN] = 0;
if (tcsetattr(fd,TCSANOW,&term_opt) != 0) {
close(fd);
return -1;
}
tcflush(fd, TCIOFLUSH);
return fd;
}
//设置串口速率
int set_uart_speed(int fd, int speed)
{
int i,j;
int ret;
struct termios term_opt;
tcgetattr(fd, &term_opt);
j=sizeof(__speed_table)/sizeof(int);
for (i= 0;i
if (speed==__name_table) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&term_opt, __speed_table);
cfsetospeed(&term_opt, __speed_table);
ret=tcsetattr(fd, TCSANOW, &term_opt);
if (ret != 0) return -1;
tcflush(fd,TCIOFLUSH);
break;
}
}
return 0;
}
//设置校验
int set_uart_parity(int fd,int databits,int stopbits,int parity)
{
struct termios term_opt;
if (tcgetattr(fd, &term_opt) != 0) return -1;
term_opt.c_cflag &= ~CSIZE;
switch (databits) {
case 5:
term_opt.c_cflag |= CS5;
break;
case 6:
term_opt.c_cflag |= CS6;
break;
case 7:
term_opt.c_cflag |= CS7;
break;
case 8:
term_opt.c_cflag |= CS8;
break;
default:
return -1;
}
switch (parity)
{
case 'c':
term_opt.c_cflag &= ~PARENB;
term_opt.c_iflag &= ~INPCK;
break;
case 'o':
term_opt.c_cflag |= (PARODD | PARENB);
term_opt.c_iflag |= INPCK;
break;
case 'e':
term_opt.c_cflag |= PARENB;
term_opt.c_cflag &= ~PARODD;
term_opt.c_iflag |= INPCK;
break;
default:
return -1;
}
switch (stopbits)
{
case 1:
term_opt.c_cflag &= ~CSTOPB;
break;
case 2:
term_opt.c_cflag |= CSTOPB;
break;
default:
return -1;
}
if (tcsetattr(fd,TCSANOW,&term_opt) != 0) return -1;
tcflush(fd,TCIOFLUSH);
return 0;
}
/*ssize_t write_uart_timeout(int fd, void *buf, size_t count, int timeout)
{
unsigned int len;
size_t ret,haveread=0,left=count;
int i;
if (buf == NULL) return -1;
for (i=0;i
ret=write(fd, buf+haveread, left);
if (ret == -1) break;
haveread+=ret;
if (haveread
left-=ret;
pause(); //wait next time cycle
continue;
}else
break;
}
return haveread;
}
ssize_t read_uart_timeout(int fd, void *buf, size_t count, int timeout)
{
struct termios old,new;
ssize_t ret;
tcgetattr(fd, &old);
memcpy(&new,&old,sizeof(struct termios));
new.c_cc[VTIME] = timeout*10;
if (tcsetattr(fd,TCSANOW,&new) != 0) return -1;
ret=read(fd, buf, count);
tcsetattr(fd,TCSANOW,&old);
return ret;
}
*/
//主界面编程如下:
//main.cpp
#include
#include
#include"maindialog.h"
#include"uartio.h"
int uartfd=0; //全局变量,持有串口文件描述符
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
//打开串口1
uartfd=open_uart("/dev/tts/1");
set_uart_speed(uartfd,9600);
set_uart_parity(uartfd,8,1,'c');
//应用样式表
QFile file("css3.qss");
file.open(QFile::ReadOnly);
QString st1=QObject::tr(file.readAll());
qApp->setStyleSheet(st1);
//构造主对话框
MainDialog test;
// test->setStyleSheet(st1);
test.show();
return app.exec();
}
//maindialog.h
#ifndef MAINDIALOG_H
#define MAINDIALOG_H
#include
#include"ui_Main.h"
class MainDialog:public QDialog,public Ui_MainGprsDialog
{
Q_OBJECT
public:
MainDialog(QWidget*parent=0);
public slots:
void showTel();
void showMes();
};
#endif
//maindialog.cpp
#include"maindialog.h"
#include
#include"teldialog.h"
#include"mesdialog.h"
MainDialog::MainDialog(QWidget*parent):QDialog(parent)
{
setupUi(this);
setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
setGeometry(0,0,320,240);
connect(pushButton,SIGNAL(clicked()),this,SLOT(showTel()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(showMes()));
}
void MainDialog::showTel()
{
TelDialog*tel=new TelDialog;
tel->show();
}
void MainDialog::showMes()
{
MesDialog*mes=new MesDialog;
mes->show();
}
//打电话的窗体
#ifndef TELDIALOG_H
#define TELDIALOG_H
#include
#include
#include"ui_tel.h"
class TelDialog:public QDialog,Ui::TelDialog
{
Q_OBJECT
public:
TelDialog(QWidget *parent=0);
public slots:
void shuziClicked();
void black();
void call();
void stop();
void listen();
};
#endif
//teldialog.cpp
#include"teldialog.h"
#include
#include
/*#include
#include
#include
#include*/
#include"uartio.h"
//#include
extern int uartfd;
TelDialog::TelDialog(QWidget*parent):QDialog(parent)
{
setupUi(this);
setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
setGeometry(0,0,320,240);
connect(pushButton1,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton2,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton3,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton4,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton5,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton6,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton1_2,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton1_3,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton1_4,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton1_5,SIGNAL(clicked()),this,SLOT(stop()));
connect(pushButton1_6,SIGNAL(clicked()),this,SLOT(shuziClicked()));
connect(pushButton1_7,SIGNAL(clicked()),this,SLOT(call()));
connect(pushButton1_8,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton1_9,SIGNAL(clicked()),this,SLOT(listen()));
connect(pushButton1_10,SIGNAL(clicked()),this,SLOT(black()));
/*uartfd=open_uart("/dev/tts/1");
set_uart_speed(uartfd,9600);
set_uart_parity(uartfd,8,1,'c');
*/
}
//所有数字键都被关联到这个槽上
void TelDialog::shuziClicked()
{
//获取发送信号的数字键的指针
QPushButton *btn=qobject_cast(sender());
//将文本转换成整型
int suzeValue=btn->text().toInt();
//添加到文本框中
lineEdit->setText(lineEdit->text()+QString::number(suzeValue)) ;
}
//接听电话
void TelDialog::listen()
{
write(uartfd,"ATA\r",strlen("ATA\r"));
sleep(1);
qDebug()
}
//挂机
void TelDialog::stop()
{
write(uartfd,"ATH\r",strlen("ATH\r"));
sleep(1);
qDebug()
}
//退格
void TelDialog::black()
{
//获取文本
QString text=lineEdit->text();
//删除一个
text.chop(1);
//设置回去
lineEdit->setText(text);
// lineEdit->setText(lineEdit->text().chop(1));
qDebug()
}
//打电话
void TelDialog::call()
{
QString send="ATD "+lineEdit->text()+";\r";
QString e1="ATD ",e2=";\r",d,Sn;
d=lineEdit->text();
Sn=e1+d+e2;
const char *tet=qPrintable(Sn);
//const char *tt=Sn.toLatin1().data();
write(uartfd,tet,strlen(tet));
// write(uartfd,Sn.toLatin1().data(),strlen(Sn.toLatin1.data()));
//write(uartfd,"test",4);
//write(uartfd,(char*)&send.toLatin1().data(),strlen(send.toLatin1.data()));
sleep(1);
//qDebug()
//fprintf(stderr,"%s",send.toLatin1().data());
qDebug()
}
//发短信
#ifndef MESDIALOG_H
#define MESDIALOG_H
#include
#include"ui_mes.h"
class MesDialog:public QDialog,public Ui_MesDialog
{
Q_OBJECT
public:
MesDialog(QWidget*parent=0);
public slots:
void send();
void zimuclicked();
void shuziclicked();
void zimuback();
void shuziback();
};
#endif
#include"mesdialog.h"
#include
extern int uartfd;
MesDialog::MesDialog(QWidget*parent):QDialog(parent)
{
setupUi(this);
setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
setGeometry(0,0,320,240);
connect(pushButtonExit,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButtonA,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonB,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonC,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonD,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonE,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonF,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonG,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonH,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonI,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonJ,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonK,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonL,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonM,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonN,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonO,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonP,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonQ,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonR,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonS,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonT,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonU,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonV,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonW,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonX,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonY,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonZ,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonDou,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonDian,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonTan,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonPie,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonWen,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButtonSpace,SIGNAL(clicked()),this,SLOT(zimuclicked()));
connect(pushButton0,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton1,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton2,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton3,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton4,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton5,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton6,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton7,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton8,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButton9,SIGNAL(clicked()),this,SLOT(shuziclicked()));
connect(pushButtonTdel,SIGNAL(clicked()),this,SLOT(shuziback()));
connect(pushButtonMdel,SIGNAL(clicked()),this,SLOT(zimuback()));
connect(pushButtonSend,SIGNAL(clicked()),this,SLOT(send()));
}
void MesDialog::send()
{
QString mes=mescontent->text()+"\x1a";
QString tel="AT+CMGS="+telnum->text()+"\r";
char getch[15];
const char* meschar=qPrintable(mes);
const char* telchar=qPrintable(tel);
write(uartfd,"AT+CMGF=1\r",strlen("AT+CMGF=1\r"));
sleep(1);
write(uartfd,telchar,strlen(telchar));
sleep(1);
write(uartfd,meschar,strlen(meschar));
sleep(3);
read(uartfd,getch,strlen(getch));
sleep(1);
QMessageBox::information(this,tr(""),tr(getch));
}
void MesDialog::shuziclicked()
{
QPushButton*btn=qobject_cast(sender());
int suzeValue=btn->text().toInt();
telnum->setText(telnum->text()+QString::number(suzeValue));
}
void MesDialog::zimuclicked()
{
QPushButton*btn=qobject_cast(sender());
QString zimuValue=btn->text().toLower();
mescontent->setText(mescontent->text()+zimuValue);
}
void MesDialog::zimuback()
{
QString text=mescontent->text();
text.chop(1);
mescontent->setText(text);
}
void MesDialog::shuziback()
{
QString text=telnum->text();
text.chop(1);
telnum->setText(text);
}
这东东其实很简单,说白了,就是向GSM 模块写AT指令,因为GSM模块是成品,早已封装好了,这样实现太简单了。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56374/showart_2124292.html |
|