线程定时实现linux下的Qt串口编程.doc_第1页
线程定时实现linux下的Qt串口编程.doc_第2页
线程定时实现linux下的Qt串口编程.doc_第3页
线程定时实现linux下的Qt串口编程.doc_第4页
线程定时实现linux下的Qt串口编程.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

线程+定时实现linux下的Qt串口编程作者:lizzy115 时间:2010,5,14说明:本设计采用的是线程+定时实现linux下的Qt串口编程,而非网上资料非常多的Qt编写串口通信程序全程图文讲解系列,因为Qt编写串口通信程序全程图文讲解系列是很好实现,那只是在windows下面的,可是在linux下面实现串口的通信并非如此,原因在于QextSerialBase:EventDriven跟QextSerialBase:Polling这两个事件的区别,EventDriven属于异步,Polling属于同步,在windows下面使用的是EventDriven很容易实现,只要有数据就会触发一个串口事件,网上说linux下面需要的是Polling,可是还是不行的,只要串口有数据的时候他会在QByteArray temp = myCom-readAll(); 这句一直读取数据,没能退出,直到断掉串口的时候才能把接受到的串口数据通过ui-textBrowser-insertPlainText(temp);打印在界面上,一直没能解决这个问题,所以只好采用线程+定时实现linux下的Qt串口编程进行设计。一、安装环境:系统平台:Ubuntu-8.04,内核2.6.24-27-generic,图形界面二、软件需求及下地地址:Qt版本 qt-linux-SDK-4.6.2注意:此处使用的是qt-linux-SDK-4.6.2版本,编译通过了,之后需要把他移植到qt-embedded-linux-opensource-src-4.5.3.tar.gz,通过qte编译后移植到开发板中,采用的测试开发板为Micro2440,下载地址:略三、程序编写过程:程序编程流程: 先新建一个工程空白工程,再建立Ui文件,通过designer进行Ui界面设计,设计完保存,编译生成ui_mainwindow.h头文件,编写线程头文件及线程处理.cpp文件,建立串口处理头文件及 .cpp文件,最后完成main.cpp文件。1、 Ui文件的设计:建立Ui_MainWindow主窗口,在窗口上添加三个QPushButton,分别命名为closeButton、writeButton、readButton,再添加一个QTextBrowser显示串口接收数据,保存退出,编译一下就可以生成ui_mainwindow.h文件。2、线程程序设计: 编写一个线程程序,其不需要进行界面设计,直接实现线程的管理,实现串口的收发工作,其主要程序及说明如下:1) 新建一个thread.h头文件,内容如下:#ifndef THREAD_H#define THREAD_H#includeclass Thread:public QThread Q_OBJECT public: Thread(); char buf128; volatile bool stopped; volatile bool write_rs; volatile bool read_rs; protected: virtual void run();#endif程序定义一个Thread类,它继承于QThread,设有一些变量和一个run函数,virtual表示为虚函数,你也可以去掉,加上去会增加一些内存开销,但提高了效率,对于这个小程序是看不出什么效果的,volatile为一函数数据类型,是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量,其可以在不同数据类型间进行转化,保证对此变量的读写操作都不会被优化。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。2)新建一个thread.cpp文件,内容如下:#includethread.h#include #include #include #include /串口用到的#include #include #include #include #define BAUDRATE B9600#define RS_DEVICE /dev/ttyS0 /串口1/#define RS_DEVICE /dev/ttySAC1 /串口1Thread:Thread() /析构void Thread:run() /这就是线程的具体工作了 int fd,c=0,res;struct termios oldtio,newtio; /termios结构是用来保存波特率、字符大小等printf(start.n);fd=open(RS_DEVICE,O_RDWR|O_NOCTTY); /以读写方式打开串口。不控制TTYif(fd0)perror(error);exit(1); /失败退出printf(Open.n);tcgetattr(fd,&oldtio); /保存当前设置到oldtiobzero(&newtio,sizeof(newtio); /清除newtio结构,并重新对它的成员设置如下newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD; /9600、8位、忽略DCD信号、启用接收装置newtio.c_iflag|=IGNPAR; /忽略奇偶newtio.c_oflag=0;newtio.c_lflag=0; newtio.c_ccVMIN=0; newtio.c_ccVTIME=100; /在规定时间(VTIME)内读取(VMIN)个字符;tcflush(fd,TCIFLUSH); /清除所有队列在串口的输入与输出;tcsetattr(fd,TCSANOW,&newtio); /把我们的设置写入termioswhile(stopped) /stopped为0时将退出线程 if(write_rs) /write_rs为1时把字符串从串口中输出write_rs=0;write(fd,QtEmbedded-4.5.3,16); if(read_rs) /read_rs为1时读取,并存在bufread_rs=0;res=read(fd,buf,10);bufres=0;emit finished(); /读完后发一个信号printf(Close.n);tcsetattr(fd,TCSANOW,&oldtio); /重新设置回原来的close(fd);quit(); 通过stopped变量来实现线程控制。3、主窗口程序设计:主窗口程序包括线程的启动与处理,通过信号与槽机制通过write按键实现写串口,通过定时器实现读串口操作,通过close按键实现串口关闭,同时把读取串口数据进行显示,其主要程序及分析如下:1)新建一个mainwindow.h头文件,内容如下:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include#includeui_mainwindow.h / ui_mainwindow.h 文件为designer设计mainwindow.ui文件后,经过make后会生成这个头文件,#includethread.h /包含线程包头文件 class MainWindow:public QMainWindow,public Ui:MainWindow /多继承 Q_OBJECT public: MainWindow(QWidget *parent=0); public slots: void writeThread(); void readThread(); void closeThread(); void display(); private: Thread *yy;#endifMainWindow继承于QMainWindow和MainWindow,即多继承,对于不是很复杂的程序,用多继承是一个较好的方法,如果程序较复杂,建议用单继承,具体原因待进一步研究,呵呵。2)新建一个mainwindow.cpp文件,实现程序内容如下:#includemainwindow.h MainWindow:MainWindow(QWidget *parent) :QMainWindow(parent) setupUi(this); yy = new Thread; yy-start(); /启动线程 yy-stopped=1; /初始化变量 yy-write_rs=0; yy-read_rs=0; QTimer *time = new QTimer(this); /新建定时类 time-start(50); /50ms定时 connect(writeButton,SIGNAL(clicked(),this,SLOT(writeThread(); /通过信号与槽实现按键按下进行写串口操作 connect(time,SIGNAL(timeout(),this,SLOT(readThread(); /定时溢出实现读串口操作connect(closeButton,SIGNAL(clicked(),this,SLOT(closeThread(); connect(yy,SIGNAL(finished(),this,SLOT(display(); /接收信号实现显示void MainWindow:display()textBrowser-setText(yy-buf); /读到的数据在textBrowser l显示 void MainWindow:writeThread() /写数据线程槽函数 yy-write_rs=1;void MainWindow:readThread() /读数据线程槽函数 yy-read_rs=1;void MainWindow:closeThread() /停止槽函数yy-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论