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学习笔记】——用QTextStream创建输入输出变量

在Qt中,用的最多的是GUI页面,但GUI比较慢,有些小的试验不妨先用console,当然在Qt里面可以直接使用cout, cin这些。 不过可能不会兼容Qt自带的一些类型,比如QByteArray等...

(十八)Qt中的输入组件

Qt中的输入组件一共有十三种,分别是下拉列表框QComboBox、字体组合框QFontComboBox、行编辑框QLineEdit、多行富文本编辑框QTextEdit、多行文本编辑框QPlainTex...

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

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

Qt从零开始制作串口调试助手-(第十三章、其他功能完善)-Creator_Ly

第十三章、其他功能完善 1、清除发送数据内容 ⑴添加清楚发送槽函数,选择clicked()。   ⑵添加清除发送数据处理程序。   2、串口断开功能实现 ⑴创建串口断开函数   ⑵串...

OMAPL138/AM1808 修改调试串口为UART1后通过CCSV4下载程序的全过程(原创)

OMAPL138/AM1808 修改调试串口为UART1后通过CCSV4下载程序的全过程 一、   需要用的资料: 1) OMAP-L138_FlashAndBootUtils_2_30.tar....
  • qqtolm
  • qqtolm
  • 2014年01月16日 08:37
  • 2288

USBCAN转串口(UART)在PC上调试

1、CSM100或CSM100T,使用前,需要配置;配置时,需要将引脚2(GND)和引脚24(CFG)短路;配置后,需要将引脚2和24断开,并断电重连。 2、将它的引脚11(CANL)和引脚12(CA...

mini2440 UART实现串口接收后转换为整型数据

本实验通过UART接受数据,判断数据类型,转换为整型数据,打印出输入数据的整型值。本实验为以后裸机实验输入部分打下基础,具体实现以注释形式给出,实验代码如下: #define    GLOBAL...

基于Spartan-6平台简单实现异步fifo与UART串口通信的联合使用

UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。  串行外设...

Linux下使用putty进行UART串口调试

在Session选项卡中      Serial line 输入 /dev/ttyUSB0 ;   Speed 输入115200 ; Connection type选择Serial 在Window选项...

Android开发与调试二:串口uart Debug

安卓智能硬件开发板,往往会预留一个uart口,串口的形式打出log出来,便于我们开发的时候debug。...
  • dahunbi
  • dahunbi
  • 2016年10月12日 17:31
  • 2082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt实现UART串口调试功能
举报原因:
原因补充:

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