注意: Qt5发布之前,Qt实现串口通信一般是采用第三方类库qextserialport。Qt5发布后自带了QtSerialPort 能够支持串口通信。

1、Qextserialport类介绍

在Qt5之前的版本中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,本文章主要是讲解怎样利用此类实现串口通信。

2、文件下载地址:

最新文件下载在文章最后!

http://sourceforge.net/projects/qextserialport/files/

3、文件内容:

3.1.下载到的文件为qextserialport-1.2win-alpha ,解压并打开后其内容如下。

(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。

(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。

(3)html文件夹中是QextSerialPort类的使用文档。

(4)然后就是剩下的几个文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面就不再介绍它了。

(5)qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类,win_qextserialport.cpp和win_qextserialport.h文件定义了一个Win_QextSerialPort类,posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类,qextserialport.cpp和qextserialport.h文件定义了一个QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,使得在任何平台上都可以使用它。

在Windows下是:

qextserialbase.cpp和qextserialbase.h 以及win_qextserialport.cpp和win_qextserialport.h

在Linux下是:

qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h

而在Windows下我们可以使用事件驱动EventDriven方式,也可以使用查询Polling方式,但是在Linux下我们只能使用查询Polling方式。

4、串口通信的实现

4.1  声明串口对象 :

Win_QextSerialPort  *myCom;      //Windows系统内
Posix_QextSerialPort *myCom; //Linux系统内

4.2 串口定义:

//Windows中有两种查询模式,一种polling模式,一种EventDriven模式
myCom = new Win_QextSerialPort("COM1",QextSerialBase::Polling); //
myCom = new Win_QextSerialPort("COM1",QextSerialBase::EventDriven);
//Linux中只有Polling模式
myCom = new Posix_QextSerialPort("/dev/ttyS0",QextSerialBase::Polling);

事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。

查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。

在Windows下支持以上两种模式,而在Linux下只支持Polling模式。

4.3 串口打开模式

myCom ->open(QIODevice::ReadWrite);    //打开模式
QIODevice::Unbuffered 0x0020 描述
QIODevice::NotOpen 0x0000  
QIODevice::ReadOnly 0x0001  
QIODevice::WriteOnly 0x0002  
QIODevice::ReadWrite ReadOnly | WriteOnly  
QIODevice::Append 0x0004  
QIODevice::Truncate 0x0008  
QIODevice::Text 0x0010  

4.4 串口的配置函数

myCom->setBaudRate(BAUD9600);          //波特率设置,我们设置为9600
myCom->setDataBits(DATA_8); //数据位设置,我们设置为8位数据位
myCom->setParity(PAR_NONE); //奇偶校验设置,我们设置为无校验
myCom->setStopBits(STOP_1); //停止位设置,我们设置为1位停止位
myCom->setFlowControl(FLOW_OFF); //控制流 myCom->setTimeout(long); //设置时间间隔

setTimeout(long)参数决定了Polling查询模式的读取串口的速度。

4.5 串口工作

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));    //EventDriven模式下才能触发readyRead()信号
connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom())); //Polling模式定时器触发timeout()信

4.6 串口读取数据

QByteArray temp = myCom->readAll();    //返回读取的字节
int byteLen = myCom->bytesAvailable(); //返回串口缓冲区字节数

4.7 串口写数据

myCom -> Write(const char * data, qint64 maxSize );          //
myCom -> Write(const char * data ); //
myCom -> Write(const QByteArray & byteArray); //
int byteLen = myCom->bytesToWrite(); //输出写数据的字节数
//bytesWritten()信号函数来获取已经发送的数据的大小。

5、Qt5以后版本QSerialPort介绍

5.1  .pro文件内需要加上如下代码

QT += serialport               //加在第一行或者第二行

5.2 网上一段利用QSerialPort写的串口通信代码(转自:http://www.doc88.com/p-645858545768.html

#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
read_port = new mythread(this);
connect(this->read_port, SIGNAL(read_port_data()), this, SLOT(display_data()));
} Dialog::~Dialog()
{
//delete this->my_serialport;
delete ui;
} void Dialog::on_pushButton_clicked() //open serial,打开串口
{
this->read_port->start();
} void Dialog::display_data() //显示数据
{
ui->textBrowser->setText(this->read_port->requestData);
}
//对话框头文件
#ifndef DIALOG_H
#define DIALOG_H #include "mythread.h" namespace Ui
{
class Dialog;
} class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void on_pushButton_clicked();
void display_data();
private:
Ui::Dialog *ui;
mythread *read_port;
}; #endif // DIALOG_H
#include "mythread.h"

mythread::mythread(QObject *parent) :
QThread(parent)
{
my_serialport = new QSerialPort(this);
} void mythread::run()
{
this->my_serialport->setPortName("com3");
this->my_serialport->open(QIODevice::ReadWrite);
this->my_serialport->setBaudRate(115200);
this->my_serialport->setDataBits(QSerialPort::Data8);
this->my_serialport->setParity(QSerialPort::NoParity);
this->my_serialport->setStopBits(QSerialPort::OneStop);
this->my_serialport->setFlowControl(QSerialPort::NoFlowControl); while(1)
{
requestData = "";
while(this->my_serialport->waitForReadyRead(10))
{
requestData += this->my_serialport->readAll();
} if(!requestData.isEmpty())
{
emit(this->read_port_data());
qDebug() << "===============" <<requestData;
}
}
}

6、如何抓取串口数据

6.1 、使用超级终端

Windows XP之前(包括Windows XP)版本系统自带,程序位置:

开始 ->程序->附件->通讯 ->超级终端。

6.2、使用串口调试助手

串口调试助手软件非常多:例如CommAssistant.exe、

3、使用Bus Hound工具(推荐使用)

下载地址:http://www.xz7.com/dir/208/248/200604121464.html

6.4 虚拟串口调试工具

常用的两款虚拟串口调试工具:

1、VSPD下载地址: http://www.cr173.com/soft/21406.html

2、VSPM下载地址:http://www.onlinedown.net/soft/58180.htm

通过虚拟软件,进行虚拟设置后,并以串口调试助手工具配合工作。这样就可以在没有物理串口的条件下进行调试测试等。

Qt实现串口通信总结的更多相关文章

  1. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  2. 转:Qt编写串口通信程序全程图文讲解

    转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...

  3. Qt编写串口通信程序全程图文讲解 .

    在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...

  4. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

  5. Qt串口通信专题教程

    查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...

  6. QT串口通信编程

    QT串口编程 文件夹目录结构如下图所示 设计的示例界面如下图所示 首先在项目文件里面添加一句 QT += serialport SerialPortDemo.pro文件如下: #----------- ...

  7. 串口通信中,QString 、QByteArray 转化需要注意的问题

    在做串口通信的时候,其中犯了一个错误.在此记录一下:QT中串口通信接到收据和发送数据的接口如下: QByteArray QIODevice::readAll()//接受数据 qint64 QIODev ...

  8. Qt 串口通信

    在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台   QextSerialPort QT C++ Win/Linux http://sourceforge. ...

  9. QT 串口通信 数据16进制发送

    在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray ...

随机推荐

  1. ExecutorService 用例

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Tes ...

  2. Storm实战常见的问题

    该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...

  3. 如何简单的测试kubernetes的dns add-ons是否工作正常?

    1,新建一个yaml文件. apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: ...

  4. php 通过类名获取类的文件地址

    $reflector = new ReflectionClass("Child"); $fn = $reflector->getFileName(); return dirn ...

  5. Java实现蛇形矩阵

    public class Solution { //下x++ 左y-- 上x-- 右y++ public void prints(int n) { int[][] mp = new int[n][n] ...

  6. 【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)

    2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个 ...

  7. Now Task

    1. Java 多线程 首先整理基本功,如线程的状态,和调度 多线程的经典例子,包括代码在内 多线程死锁的问题,要结合数据库的例子来整理 JDK1.5的若干要点 多线程的设计模式 2. NIO 需要掌 ...

  8. ServletContext (上下文对象)

    一.什么是ServletContext ServletContext代表是一个web应用的上下文对象(web应用对象) 里面封装的都是web应用信息 一个ServletContext对应一个应用 二. ...

  9. <四边形不等式优化>[NOI1995]石子合并

    留个坑 挺套路的 明天来写个总结 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = ...

  10. 【构造】【分类讨论】Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor

    题意:给你n,x,均不超过10^5,让你构造一个无重复元素的n个元素的非负整数集合(每个元素不超过10^6),使得它们的Xor和恰好为x. 如果x不为0: 随便在x里面找一个非零位,然后固定该位为0, ...