版权声明
该文章原创于Qter开源社区(www.qter.org),转载请注明出处!
软件:QCom跨平台串口调试助手!
更新提示
这次源码更新,与前面“串口通信专题”主要有下面两点不同:
1.以前必须先使用open()函数打开串口,再进行配置;而现在打开串口和配置串口没有顺序要求;
2.以前在Linux下面必须使用查询polling(或者叫轮询)的方式读取串口,现在在Linux下面也可以使用事件驱动的方式。
概述
yafeilinux.com以前推出了“Qt串口通信专题教程”,得到很多网友的关注和支持。对此我们表示感谢!由于最近对Wincom和Lincom进行了更新整合,推出了可以跨平台编译的QCom,所以有必要推出本文档。本文档是“Qt串口通信专题教程”的升级和改进。希望通过本文档,可以帮助大家理解和掌握基于QT的串口通信程序的编写。以下是跨平台串口调试助手QCom在Ubuntu下的界面截图。
本教程分为三部分进行讲述。第一部分讲解关于串口通信的基础知识;第二部分讲解qextserialport类的结构和使用方法;第三部分结合QCom实例具体的讲解qextserialport类的应用。在本教程中我们更注重串口通信相关知识的讲解,而不是界面的设计。关于界面的设计和关于QT更多的知道请关注qter.org的精品文章专区。
第一部分 关于串口通信的基础知识
一、连接方式
目前使用最广泛的串口为DB9接口,它适用于较近距离的通信。一般小于10米。DB9接口有9个针脚。它们的编号名称和作用如下表所示:
虽然DB9接口有9个针脚,但在做普通的通信用时候,只会用到2、3、5这三个针脚。这也就是我们通常所说的“三线制”连接方法。在连接的时候需要把一方的2针脚接别一方的3针脚,也就是一方的接收针脚连接另一方的发送针脚。5针脚和另一方的5针脚相连。也就是两方的信号地连接在一起。如下图所示:
二、参数简介
三、数据传输方式
关于这一部分的详细介绍,可以参考“串口通讯—异步通信方式”一文。
第二部分 qextserialport类的结构和使用方法
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也使用了该类。
一、文件下载
官方下载地址:
http://code.google.com/p/qextserialport/wiki/Downloads
在本文中所使用的qextserail的版本为1.2rc。
二、文件内容介绍
1.下载到的文件为qextserialport-1.2rc.zip ,解压并打开后其内容如下。
下面分别介绍:
(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。
(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。
(3)src文件夹中是QextSerialPort类的代码,真正使用到的源文件都存这个文件夹中。现在来详细看一下src文件夹下有哪些文件,如下图:
这么多文件,哪真正对我们有用的又有哪些呢?
在windows下需要用到的文件有:
qextserialport.cpp
qextserialport_global.h
qextserialport.h
qextserialport_p.h
qextserialport_win.cpp
在linux下需要的文件有:
qextserialport.cpp
qextserialport_global.h
qextserialport.h
qextserialport_p.h
qextserialport_unix.cpp
仔细看一下,会发现,在两个不同的平台下需要的文件前几个是一样的,只有最后一个不同。这说明,不同平台实现的具体代码存在于这两个文件中。其它的一些文件用不到,可以不用管它。
2.qextserialport的简单介绍
qextserialport类的声明在qextserialport.h中。我们可以调用的成员函数和一些类型定义都可以在这个文件中找到。下边我们来看一下qextserialport类的定义:
class QEXTSERIALPORT_EXPORT QextSerialPort: public QIODevice
可以看到继承自QIODevice类,所以该类的一些函数我们也可以直接来使用。这个类提供给我们四个构造函数,在实际编程中可以酌情使用。声明如下:
explicit QextSerialPort(QueryMode mode = EventDriven, QObject *parent = 0);
explicit QextSerialPort(const QString &name, QueryMode mode =EventDriven, QObject *parent = 0);
explicit QextSerialPort(const PortSettings &s, QueryMode mode =EventDriven, QObject *parent = 0);
QextSerialPort(const QString &name, const PortSettings &s,QueryMode mode = EventDriven, QObject *parent=0);
关于explicit这个关键字的作用,如果有兴趣可以问一问google,如果没兴趣可以直接忽略它。另外,这个类提供给我们可以调用的关键成员函数有:
void setBaudRate(BaudRateType);//设置波特率
void setDataBits(DataBitsType);//设置数据位
void setParity(ParityType);//设置校验类型
void setStopBits(StopBitsType);//设置停止位
当然还有其它的一些成员函数,详细内容可以打开qextserialport.h这个文件来看一下,我们在这里就不一一列出了。
在QextSerialPort类中还涉及到了一个枚举变量QueryMode。它有两个值Polling和EventDriven 。QueryMode指的是读取串口的方式,下面我们称为查询模式,我们将Polling称为查询方式Polling,将EventDriven称为事件驱动方式。
事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
而查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。我们需要自己建立定时器来读取串口的数据。
需要注意的是:以前版本的QextSerialPort类,在linux下面只能使用Polling查询的方式读取串口,而该类的最新版本已经支持在linux下使用事件驱动的方式读取串口。
第三部分 qextserialport类在QCom跨平台串口调试助手中的应用
QCom跨平台调试助手是qter.org推出的串口通信调试软件,源代码完全公开。大家可以完全免费的使用这个软件,并可以通过这个软件学习QT环境下的串口通信编程。(项目主页)
一、在qcom.pro文件中如何实现不同平台下使用不同的源文件
以下是qcom.pro的部分代码:
SOURCES += main.cpp\
mainwindow.cpp \
aboutdialog.cpp\
qextserial/qextserialport.cpp
HEADERS += mainwindow.h \
aboutdialog.h\
qextserial/qextserialport_global.h \
qextserial/qextserialport_p.h\
qextserial/qextserialport.h
win32 {
//如果是windows环境把qextserialport_win.cpp加入到源文件列表中
SOURCES+= qextserial/qextserialport_win.cpp
}
unix {
//如果是linux环境把qextserialport_unix.cpp加入到源文件列表中
SOURCES+= qextserial/qextserialport_unix.cpp
}
二、qextserialport的定义和设置
下面这段代码存在于QCom项目中的mainwindow.cpp文件中:
#ifdef Q_OS_LINUX
myCom= new QextSerialPort("/dev/" + portName);
#elif defined (Q_OS_WIN)
myCom= new QextSerialPort(portName);
#endif
connect(myCom, SIGNAL(readyRead()), this, SLOT(readMyCom()));
可以看到,在不同的平台下,我们给QextSerialPort类的参数是不同的。参考上一部分中的QextSerialPort类的构造函数,可以看到,这里采用的是“事件驱动”方式。
最后一行代码实现了信号的槽的连接。这样,当串口收到数据以后,就会调readMyCom()函数。
结语
这篇教程只是帮助大家更容易看懂QCom跨平台串口调试助手的源码,并没有涉及编程的细节。大家也可以参考以前推出的Qt串口编程教程。
转载:http://bbs.qter.org/forum.php?mod=viewthread&tid=42