Qt实现UART串口调试功能

原创 2016年08月31日 09:30:02

如何在Qt上实现UART串口调试功能

需要的工具

Qt版本:Qt4.8.6
外部包:qextserialport-1.2rc.zip http://download.csdn.net/detail/u010564071/7644363

关于qextserialport-1.2rc.zip

解压后“/src”目录下会有以下几个文件:

qextserialport.pri
qextserialport_p.h
qextserialport_global.h
qextserialport.h
qextserialenumerator_p.h
qextserialenumerator.h
qextserialport_win.cpp
qextserialport_unix.cpp
qextserialport.cpp
qextserialenumerator_win.cpp
qextserialenumerator_unix.cpp
qextserialenumerator_osx.cpp
qextserialenumerator_linux.cpp
qextserialenumerator.cpp

根据操作系统选择需要的文件,下面以windows环境举例,介绍一下如何使用Qt在windows环境下开发UART串口调试功能。


首先通过Qt设计师设计Ui界面,主要是添加UART配置信息

常见的包括串口、波特率、数据位、校验位、停止位、超时时间、查询模式,再添加一个自动发送的功能

这里写图片描述

uarttrans.h

#ifndef UARTTRANS_H
#define UARTTRANS_H

#include "ui_uarttrans.h"
#include <QtGui/QMainWindow>
#include "qextserialport.h"
#include "qextserialenumerator.h"

class uarttrans : public QWidget
{
    Q_OBJECT
public:
    uarttrans(QWidget *parent = 0);
    Ui::uarttrans ui;
    ~uarttrans();

private:
    QTimer *timer; //超时时间
    QTimer *autoTimer; //自动发送时间
    QextSerialPort *port; //串口类
    QextSerialEnumerator *enumerator; //枚举串口

public:
    void initial();//初始化界面
public slots:
    void onPortNameChanged(const QString &name); //串口COM选择
    void onBandRateChanged(int idx); //设置波特率
    void onParityChanged(int idx); //设置校验位
    void onDataBitsChanged(int idx);//设置数据位
    void onStopBitsChanged(int idx);//设置停止位
    void onQueryModeChanged(int idx);//设置查询模式
    void onTimeoutChanged(int val);//设置超时
    void onOpenCloseButtonClicked();//开关串口设置
    void onSendButtonClicked();//发送数据功能
    void onReadyRead();//接收数据功能
    void onPortAddedOrRemoved();//串口插拔检测
    void onAutoWriteClicked();//自动发送功能
};

extern uarttrans *Uarttrans;
#endif

uarttrans.cpp

#include "uarttrans.h"

uarttrans::uarttrans(QWidget *parent):QWidget(parent)
{
    ui.setupUi(this);

    //先检测已经连接的设备串口,并添加进串口下拉菜单
    foreach (QextPortInfo info, QextSerialEnumerator::getPorts())
        ui.portBox->addItem(info.portName);
    ui.portBox->setEditable(true);

    //初始化界面
    initial();

    timer = new QTimer(this);
    timer->setInterval(40);

    PortSettings settings = {BAUD115200, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 10};
    port = new QextSerialPort(ui.portBox->currentText(), settings, QextSerialPort::Polling);

    enumerator = new QextSerialEnumerator(this);
    enumerator->setUpNotifications();

    //检测设备插拔,添加或删除串口
    connect(enumerator, SIGNAL(deviceDiscovered(QextPortInfo)), SLOT(onPortAddedOrRemoved()));
    connect(enumerator, SIGNAL(deviceRemoved(QextPortInfo)), SLOT(onPortAddedOrRemoved()));

    connect(ui.bandRateBox, SIGNAL(currentIndexChanged(int)), SLOT(onBandRateChanged(int)));
    connect(ui.parityBox, SIGNAL(currentIndexChanged(int)), SLOT(onParityChanged(int)));
    connect(ui.dataBitsBox, SIGNAL(currentIndexChanged(int)), SLOT(onDataBitsChanged(int)));
    connect(ui.stopBitsBox, SIGNAL(currentIndexChanged(int)), SLOT(onStopBitsChanged(int)));
    connect(ui.queryModeBox, SIGNAL(currentIndexChanged(int)), SLOT(onQueryModeChanged(int)));
    connect(ui.timeoutBox, SIGNAL(valueChanged(int)), SLOT(onTimeoutChanged(int)));
    connect(ui.portBox, SIGNAL(editTextChanged(QString)), SLOT(onPortNameChanged(QString)));
    connect(ui.openCloseButton, SIGNAL(clicked()), SLOT(onOpenCloseButtonClicked()));
    connect(ui.sendButton, SIGNAL(clicked()), SLOT(onSendButtonClicked()));
    connect(timer, SIGNAL(timeout()), SLOT(onReadyRead()));
    connect(port, SIGNAL(readyRead()), SLOT(onReadyRead()));
    connect(ui.autoWriteBox,SIGNAL(clicked()),this,SLOT(onAutoWriteClicked()));

    //自动发送功能
    autoTimer = new QTimer(this);
    connect(autoTimer,SIGNAL(timeout()),this,SLOT(onSendButtonClicked()));
}

void uarttrans::initial()
{
    ui.bandRateBox->addItem("1200",BAUD1200);
    ui.bandRateBox->addItem("2400", BAUD2400);
    ui.bandRateBox->addItem("4800", BAUD4800);
    ui.bandRateBox->addItem("9600", BAUD9600);
    ui.bandRateBox->addItem("19200", BAUD19200);
    ui.bandRateBox->addItem("115200",BAUD115200);
    ui.bandRateBox->setCurrentIndex(5);

    ui.dataBitsBox->addItem("5", DATA_5);
    ui.dataBitsBox->addItem("6", DATA_6);
    ui.dataBitsBox->addItem("7", DATA_7);
    ui.dataBitsBox->addItem("8", DATA_8);
    ui.dataBitsBox->setCurrentIndex(3);

    ui.stopBitsBox->addItem("1", STOP_1);
    ui.stopBitsBox->addItem("2", STOP_2);
    ui.stopBitsBox->setCurrentIndex(0);

    ui.parityBox->addItem("NONE", PAR_NONE);
    ui.parityBox->addItem("ODD", PAR_ODD);
    ui.parityBox->addItem("EVEN", PAR_EVEN);
    ui.parityBox->setCurrentIndex(0);

    ui.queryModeBox->addItem("Polling", QextSerialPort::Polling);
    ui.queryModeBox->addItem("EventDriven", QextSerialPort::EventDriven);
    ui.queryModeBox->setCurrentIndex(0);

}
uarttrans::~uarttrans()
{
    delete port;
}
void uarttrans::onPortNameChanged(const QString & /*name*/)
{
    if (port->isOpen())
    {
        port->close();
        ui.openCloseButton->setText("open");
    }else
        ui.openCloseButton->setText("close");
}
void uarttrans::onBandRateChanged(int idx)
{
     port->setBaudRate((BaudRateType)ui.bandRateBox->itemData(idx).toInt());
}
void uarttrans::onParityChanged(int idx)
{
    port->setParity((ParityType)ui.parityBox->itemData(idx).toInt());
}
void uarttrans::onDataBitsChanged(int idx)
{
    port->setDataBits((DataBitsType)ui.dataBitsBox->itemData(idx).toInt());
}
void uarttrans::onStopBitsChanged(int idx)
{
    port->setStopBits((StopBitsType)ui.stopBitsBox->itemData(idx).toInt());
}
void uarttrans::onQueryModeChanged(int idx)
{
    port->setQueryMode((QextSerialPort::QueryMode)ui.queryModeBox->itemData(idx).toInt());
}
void uarttrans::onTimeoutChanged(int val)
{
    port->setTimeout(val);
}
void uarttrans::onOpenCloseButtonClicked()
{
    if (!port->isOpen())
    {
        port->setPortName(ui.portBox->currentText());
        port->open(QIODevice::ReadWrite);
        ui.openCloseButton->setText("close");
    }else
    {
        port->close();
        ui.openCloseButton->setText("open");
    }

    if (port->isOpen() && port->queryMode() == QextSerialPort::Polling)
        timer->start();
    else
        timer->stop();
}
void uarttrans::onSendButtonClicked()
{
    if (port->isOpen() && !ui.sendEdit->toPlainText().isEmpty())
        port->write(ui.sendEdit->toPlainText().toLatin1());

}
void uarttrans::onReadyRead()
{
    if (port->bytesAvailable()) {
        ui.recvEdit->moveCursor(QTextCursor::End);
        ui.recvEdit->insertPlainText(QString::fromLatin1(port->readAll()));  
    }
}
void uarttrans::onPortAddedOrRemoved()
{
    QString current = ui.portBox->currentText();

    ui.portBox->blockSignals(true);
    ui.portBox->clear();
    foreach (QextPortInfo info, QextSerialEnumerator::getPorts())
        ui.portBox->addItem(info.portName);

    ui.portBox->setCurrentIndex(ui.portBox->findText(current));

    ui.portBox->blockSignals(false);
}
void uarttrans::onAutoWriteClicked()
{
    if (ui.autoWriteBox->isChecked())
    {
        autoTimer->start(ui.AutotimeoutBox->value());
        ui.AutotimeoutBox->setEnabled(false);
    }else
    {
        autoTimer->stop();
        ui.AutotimeoutBox->setEnabled(true);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Qt从零开始制作串口调试助手-(第一章、工程文件建立)-Creator_Ly

第一章、工程文件建立 1、在E盘下创建文件夹,E:\Qt_Workspace\UartAssistant。 2、打开Qt Creator,点击 文件->新建文件或项目。   3、选择应用程序,Qt...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月08日 21:30
  • 2982

verilog 的UART 串口调试教程

今天在家中找到从学校带回来的一根USB转串口线,欣喜万分(可以做串口的调试与测试了)。 在博主chansane的博客《FPGA实现串口UART自收发》中,使用其程序,并配合网上的串口调试工具,实验了一...
  • MineralterMan
  • MineralterMan
  • 2015年07月17日 22:48
  • 1171

用示波器调试UART

用示波器调试UART     经常遇到初学者,对单片机串行通讯出了问题不知道如何办的情况。其实最有效的调试方法是用示波器观察收发数据的波形。通过观察波形可以确...
  • ws360360
  • ws360360
  • 2015年10月08日 15:33
  • 1247

Qt从零开始制作串口调试助手-(第九章、串口读数据实现)-Creator_Ly

第九章、串口读数据实现 说明: 在上一章节的添加的串口数据读取连接语句中,有提到ReadMyCom()为串口读函数,这里将实现串口读函数的内容。 1、在ComDialog.h中添加读取串口数据函...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月17日 21:28
  • 3739

Qt从零开始制作串口调试助手-(第五章、创建资源文件,并添加图片到“关于界面”)-Creator_Ly

第五章、创建资源文件,并添加图片到“关于界面”  1、右击项目,选择添加新文件   2、选择Qt,Qt资源文件,点击选择   3、填写文件名,点击下一步。   4、点击完成   5、点击添加->添加前...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月11日 21:57
  • 2592

QT 串口调试助手

实现功能: 1. 实现串口的自动检测,可接受和发送ASCII码字符串,支持发送接受汉字; 2. 实现发送和接收16进制字符,可显示发送和接受的时间,可自动换行及焦点锁定最后一行; 3. 实现状态...
  • tt1995cc
  • tt1995cc
  • 2017年03月27日 11:02
  • 781

Qt从零开始制作串口调试助手-(第十一章、数据校验码生成功能)-Creator_Ly

第十一章、数据校验码生成功能 说明: ①串口所发送的数据由发送数据框里面的帧头、数据、校验码、帧尾合并而成。 ②输入格式为十六进制(空格分隔开)。 ③校验码是由数据栏里面的数据校验产生的。 ...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月30日 21:04
  • 2279

Qt从零开始制作串口调试助手-(第八章、添加串口配置程序)-Creator_Ly

第八章、添加串口配置程序 说明:在Qt中并没有关于串口的控件,现在大部分都是使用第三方写的qextsrialport类。 官方下载地址:http://sourceforge.net/project...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月15日 18:40
  • 4396

串口uart调试小小结

写作原因:近来蛋闲?非也  !  昨天一同事合作的项目代码出现的bug-----他的上位机每200ms给我发送命令向我这边下位机读取一些数据,在此过程会按下按键做一些另外操作并给他返回数据;(通信是通...
  • yx_l128125
  • yx_l128125
  • 2013年08月23日 17:01
  • 3183

Qt从零开始制作串口调试助手-(第十章、串口接收数据处理)-Creator_Ly

第十章、串口数据操作 说明:上一章已经把串口接收调试成功,但我们还不能对接收到的数据进行一些处理,这一章节将通过下面四个方面来进行讲解。 1、十六进制显示 2、数据保存 3、停止显示 4、清除显示  ...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月19日 21:38
  • 5157
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt实现UART串口调试功能
举报原因:
原因补充:

(最多只允许输入30个字)