免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3882 | 回复: 1
打印 上一主题 下一主题

QT 串口 GSM/GPRS 打电话 发短信 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-17 20:02 |只看该作者 |倒序浏览

使用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

论坛徽章:
0
2 [报告]
发表于 2012-03-19 09:17 |只看该作者
正在用QT做一个串口信息界面,但是什么都不会,谢谢楼主的分享了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP