关闭

linux下使用 qextserialport 编写串口程序

212人阅读 评论(0) 收藏 举报
分类:

转载自:http://wenku.baidu.com/link?url=1YsJOHAW0EYV-sqhD1Hhr4BW1f3gtBy793GO8mkFIk3YqWOrKrZJYIlzDxkH97ReeOIBysuqVTQRK1082ytlUKJ_6Gi900Hkg4znzNO6BDu

最近需要编写一个基于linux的QT串口通信程序,进行简单的数据收发功能,参考网上的例子之后,发现大多是基于windows开发的,只对linux环境的开发做了简单的介绍,所以本文章直接以linux环境来讲述QT串口开发实例。  

我的操作环境及QT编辑/编译器版本如下:

OS: fedora 17 (linux-3.3.4) 

QT: Qt Creator 1.3.1 + Qt 4.6.1 

开发步骤如下: 

1.Qt中并没有特定的串口控制类,所以需要下载QT第三方写的qextserialport类 

下载地址为 http://sourceforge.net/projects/qextserialport/files/ 

下载到的文件为 qextserialport-1.2win-alpha.zip 

2.解压下载的文件到当前目录

# unzip qextserialport-1.2win-alpha.zip 

这里不对压缩包内的详细信息及qextserialport类的结构做详细介绍,直接说明需要用到的源文件  

linux下:qextserialbase.cpp qextserialbase.h posix_qextserialport.cpp posix_qextserialport.h  

windows下:qextserialbase.cpp qextserialbase.h win_qextserialport.cpp win_qextserialport.h  

3.打开Qt Creator集成开发环境,新建工程Qt4 Gui Application ,工程名为com ,其他默认即可。  

4.将上述linux下需要用到的4个文件拷贝至com工程目录下,然后将该4个文件添加至工程。 

5.将整个工程编译,会报错如下:error: 'struct PortSettings' has no member named 'Timeout_Sec' 

错误所在函数为 setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); 

我们直接将第一个参数删除即可,即为 setTimeout(Settings.Timeout_Millisec);重新编译工程成功。  

6.点击mainwindow.ui,在窗口中添加如下几个控件,因控件较少,同时为了操作方便,我们保持各部件的属性为默认值 

Text Browser 部件用来显示接收到的数据

Line Edit部件用来输入要发送的数据

Push Button按钮用来发送数据  

7.在mainwindow.h文件中进行对象及函数声明 

         7-1.添加头文件包含#include "posix_qextserialport.h"#include <QTimer>    //控制串口读写需要用到定时器 【此次不同于windows下的开发,非常重要】 

         7-2.在private中声明对象Posix_QextSerialPort *myCom;    //串口 

                                                     QTimer *readTimer;    //定时器 【此次不同于windows下的开发,非常重要】

          7-3.声明私有槽函数:private slots:   

                                                  void on_pushButton_clicked(); //“发送数据”按钮 槽函数     

                                                  void readMyCom(); //读取串口 槽函数  

8.在mainwindow.cpp文件中添加实现代码在构造函数中添加代码,完成后,构造函数内容如下: 

MainWindow::MainWindow(QWidget *parent) :     

QMainWindow(parent),    

ui(new Ui::MainWindow)

{    

ui->setupUi(this);    

//myCom = new Win_QextSerialPort("COM1",QextSerialBase::EventDriven);     

//【windows下使用】定义串口对象,指定串口名和查询模式,这里使用事件驱动EventDriven      

myCom = new Posix_QextSerialPort("/dev/ttyUSB0",QextSerialBase::Polling);     

//【linux下使用】定义串口对象,指定串口名和查询模式,这里使用Polling,若报错,拔插USB     //【此次不同于windows下的开发,非常重要】      

myCom ->open(QIODevice::ReadWrite);     //以读写方式打开串口      

myCom->setBaudRate(BAUD9600);     //波特率设置,我们设置为9600

myCom->setDataBits(DATA_8);     //数据位设置,我们设置为8位数据位      

myCom->setParity(PAR_NONE);     //奇偶校验设置,我们设置为无校验     

myCom->setStopBits(STOP_1);     //停止位设置,我们设置为1位停止位      

myCom->setFlowControl(FLOW_OFF);     //数据流控制设置,我们设置为无数据流控制      

myCom->setTimeout(200);     //延时设置,我们设置为延时200ms,如果设置为500ms的话,会造成程序无响应,原因未知   

   //connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));     

//【windows下使用】信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作,linux不支持,只能用定时     

readTimer = new QTimer(this);      //设置读取计时器   

 readTimer->start(100);     //设置延时为100ms    

connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));     

//【linux下使用】信号和槽函数关联,当达到定时时间时,进行读串口操作    

//【以上三条与君不同于windows下的开发,非常重要】}  


实现槽函数: 

void MainWindow::readMyCom() //读取串口数据并显示出来 

{     QByteArray temp = myCom->readAll();     //读取串口缓冲区的所有数据给临时变量temp    

      ui->textBrowser->insertPlainText(temp);     //将串口的数据显示在窗口的文本浏览器中


void MainWindow::on_pushButton_clicked() //发送数据

{     myCom->write(ui->lineEdit->text().toAscii());     //以ASCII码形式将数据写入串口,在Qt5中使用toLatin1}  


9.编译工程,运行程序成功。 

ps:

使用过程中遇到trying to open file,could not open file ,error 5 问题,这个是usb驱动文件的权限问题,需要修改其权限chmod 666 /dev/ttyUSB0
0
0
查看评论

linux下使用 qextserialport 编写串口小程序

转载自:http://wenku.baidu.com/link?url=1YsJOHAW0EYV-sqhD1Hhr4BW1f3gtBy793GO8mkFIk3YqWOrKrZJYIlzDxkH97ReeOIBysuqVTQRK1082ytlUKJ_6Gi900Hkg4znzNO6BDu 最近需...
  • G1036583997
  • G1036583997
  • 2015-04-01 12:52
  • 7701

arm linux下使用 qextserialport 编写串口小程序

转载自:http://wenku.baidu.com/link?url=1YsJOHAW0EYV-sqhD1Hhr4BW1f3gtBy793GO8mkFIk3YqWOrKrZJYIlzDxkH97ReeOIBysuqVTQRK1082ytlUKJ_6Gi900Hkg4znzNO6BDu 最...
  • u010580186
  • u010580186
  • 2016-06-06 14:20
  • 752

Qt上第三方串口类QExtSerialPort的使用

由于项目中需要用到串口,在Qt4下没有串口库,发现大多数人使用的是qextserialport,于是我也选择使用它。 qextserialport的源代码可以去http://sourceforge.net/projects/qextserialport/下载。 如果是在windows下串口编...
  • shanghaojia_
  • shanghaojia_
  • 2015-07-04 19:38
  • 2858

Qt串口类库QExtSerialPort的安装与简单使用

做毕业设计要用到串口通信,由于该项目是基于Qt开发的,网上查了下Qt常用的第三方类库是QExtSerialPort。于是下载下来安装了下,以下是安装的过程。一 安装  QExtSerialPort的项目网网址是:http://qextserialport.sourceforge.net/,上面有关于...
  • novawl
  • novawl
  • 2010-05-22 17:28
  • 9803

win Qt qextserialport 编写串口通信程序全程图文讲解

(说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动。) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类。我们可以去 http://...
  • u010580186
  • u010580186
  • 2016-06-06 14:22
  • 6031

Qt串行通信库 QextSerialPort需要注意的问题 便签

串行通信库 QextSerialPort需要注意的问题 1. 赋值运算符重载 2. RTS/CTS 3. 数据位和停止位 如果要从8N2转换成5N1.5,必须采用8N2--->8N1--->5N1--->5N1.5的方式 4. 时限设置 5. hEvent overlapWrite...
  • isaaccwoo
  • isaaccwoo
  • 2015-12-15 16:49
  • 883

在Linux下用QT5编写第一个串口调试程序

以下学习类容参考了yafeilinux的专栏 :http://blog.csdn.net/yafeilinux/article/details/5741706 第一步:由于我们用的是第三方库文件,所以我们首先需要下载qextserialport-1.2win-alpha,下载地址:http:/...
  • ms_xk
  • ms_xk
  • 2014-12-11 17:35
  • 1977

linux下串口应用程序

1. 打开串口 与其他的关于设备编程的方法一样,在Linux下,操作、控制串口也是通过操作起设备文件进行的。在Linux下,串口的设备文件是/dev/ttyS0或/dev/ttyS1等。因此要读写串口,我们首先要打开串口: char *dev = &qu...
  • xxgxgx
  • xxgxgx
  • 2016-02-23 16:54
  • 816

linux下用qt写的的串口小程序

转载自:http://wenku.baidu.com/link?url=1YsJOHAW0EYV-sqhD1Hhr4BW1f3gtBy793GO8mkFIk3YqWOrKrZJYIlzDxkH97ReeOIBysuqVTQRK1082ytlUKJ_6Gi900Hkg4znzNO6BDu 最...
  • linchuran
  • linchuran
  • 2015-12-23 10:34
  • 1530

Qt4 串口第一次打开问题

\class Posix_QextSerialPort \version 1.0.0 用Qt4 Posix_QextSerialPort串口程序遇到一个很奇怪的问题:  电脑开机第一次打开串口的时候Qt4写的程序的时候不能收发数据,如果用串口调试助手或者其他串口工具...
  • gaobobo138968
  • gaobobo138968
  • 2016-08-21 11:30
  • 978
    个人资料
    • 访问:3343次
    • 积分:118
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:8篇
    • 译文:0篇
    • 评论:4条
    文章分类