在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Windows系统编程 → qt 串口调试工具源码

qt 串口调试工具源码

Windows系统编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.01M
  • 下载次数:91
  • 浏览次数:1223
  • 发布时间:2019-04-28
  • 实例类别:Windows系统编程
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 串口 调试工具

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

/*************************************************************
 * 程序用途:QT串口调试助手
 *
 * 作者:陶聪
 *
 * 联系方式:QQ 1196102361
 * 欢迎大神指点
 * ***********************************************************/
#include "qtportdebug.h"
#include "ui_qtportdebug.h"
#include <QThread>

QTPortDebug::QTPortDebug(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QTPortDebug)
{
    //设置背景颜色
    setground();

    ui->setupUi(this);

    SPort = new QSerialPort(this);

    iniPort();

    //新建定时器
    timer=new QTimer(this);
    time_cycle = 1000;

    //定时器超时运行发送函数
    connect(timer,SIGNAL(timeout()),this,SLOT(sendupdata()));
    this->connect(ui->check_repsend,SIGNAL(stateChanged(int)), this,SLOT(CheckAutoRun()));
    this->connect(ui->cb_record, SIGNAL(activated(int)), this, SLOT(fillrecord()));

    //接受和发送的字节数
    rxbyte = 0;
    txbyte = 0;

    DisplayTimeStatus = false;

    initStatusbar();

    runonce = true;

    this->setWindowTitle(tr("SerialDebuging"));
}

QTPortDebug::~QTPortDebug()
{
    delete ui;
    if(timer->isActive())
    {
        timer->stop();

    }
    delete timer;
    delete SPort;

    delete rx;
    delete tx;
    delete byterx;
    delete bytetx;
    delete txnum;
    delete rxnum;

}

void QTPortDebug::setcurrentPath()
{
    currentPath = new QDir;
    PATH = currentPath->currentPath()   "/SerialPort.ini";
}
//初始化
void QTPortDebug::iniPort()
{

    QList<QSerialPortInfo>  infos = QSerialPortInfo::availablePorts();
    if(infos.isEmpty())
    {
        ui->CB_port->addItem(tr("Empty"));
        return;
    }
    foreach (QSerialPortInfo info, infos) {
        ui->CB_port->addItem(info.portName());
        //SPort->close();
    }
    //ini配置文件
    config();
    configiniRead();
    //默认选中
    ui->radio_accept_ascii->setChecked(true);
    ui->radio_send_ascii->setChecked(true);
    ui->check_auto_line->setChecked(true);
    //ui->check_repsend->setChecked(true);
    //设置只读
    ui->text_accept->setReadOnly(true);
}

void QTPortDebug::getComboBoxValue()
{
    m_port = ui->CB_port->currentText();
    m_baudrate = ui->CB_baudrate->currentText();
    m_databit = ui->CB_databit->currentText();
    m_check = ui->CB_check->currentText();
    m_stopbit = ui->CB_stopbit->currentText();
//    Com->m_FlowControl  = ui->CB_flow->currentText();

}
//设置串口参数
void QTPortDebug::setPortConfig()
{


    //设置串口号
    SPort->setPortName(m_port);
    if(SPort->open(QIODevice::ReadWrite))
    {
        //设置波特率
        SPort->setBaudRate(m_baudrate.toInt());
        //设置数据位
        switch(m_databit.toInt())
        {
            case 5:
                 SPort->setDataBits(QSerialPort::Data5);break;
            case 6:
                 SPort->setDataBits(QSerialPort::Data6);break;
            case 7:
                 SPort->setDataBits(QSerialPort::Data7);break;
            case 8:
                 SPort->setDataBits(QSerialPort::Data8);break;
            default: break;
        }
        //设置校验位
        switch(ui->CB_check->currentIndex())
        {
            case 0:
                SPort->setParity(QSerialPort::NoParity);break;
            case 1:
                SPort->setParity(QSerialPort::EvenParity);break;
            case 2:
                SPort->setParity(QSerialPort::OddParity);break;
            case 3:
                SPort->setParity(QSerialPort::SpaceParity);break;
            case 4:
                SPort->setParity(QSerialPort::MarkParity);break;
            default: break;
        }
        //设置流控制
        switch(ui->CB_flow->currentIndex())
        {
            case 0:
                SPort->setFlowControl(QSerialPort::NoFlowControl);
            case 1:
                SPort->setFlowControl(QSerialPort::HardwareControl);
            case 2:
                SPort->setFlowControl(QSerialPort::SoftwareControl);
            default: break;
        }

        //设置停止位
        switch(m_stopbit.toInt())
        {
            case 1:
                SPort->setStopBits(QSerialPort::OneStop);
            case 2:
                SPort->setStopBits(QSerialPort::TwoStop);
            default: break;
        }

        //message("config 成功\r\n");
    }
    else{
        QMessageBox::warning(this,tr("warning"),tr("initialization config failed!"));
       // message("config 失败\r\n");
    }


}
//从串口读取数据
void QTPortDebug::SerialRead()
{

    //接受ASCII码字符
    if(ui->radio_accept_ascii->isChecked())
    {

        QByteArray  data = SPort->readAll();
        //实现了从本地字符集GBK到Unicode的转换
        QString str = QString::fromLocal8Bit(data);
        if(DisplayTimeStatus)
        {
            message(currenttime->currentTime().toString("[hh:mm:ss.zzz]"));
        }
        ui->text_accept->insertPlainText(str);

        rxbyte  = str.length();//接收数据累加
    }
    //接受16进制字符
    else if( ui->radio_accept_hex->isChecked())
    {
        if(DisplayTimeStatus)
        {
            message(currenttime->currentTime().toString("[hh:mm:ss.zzz]"));
        }
        QByteArray byteArray = SPort->readAll();
        //显示16进制
        //方法一 参考博客http://www.qtcn.org/bbs/read-htm-tid-44071.html
        QDataStream out(&byteArray,QIODevice::ReadWrite);    //将字节数组读入
        while(!out.atEnd())
        {
            qint8 outChar = 0;
            out>>outChar;   //每字节填充一次,直到结束
            QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));

            message(str " ");

            rxbyte  = str.length();
        }
        //方法二 参考博客http://blog.csdn.net/maowendi/article/details/52209807
        //ui->text_accept->insertPlainText(byteArray.toHex());

    }
    //自动换行
    if(ui->check_auto_line->isChecked())
    {
        message("\r\n");
    }

    displayRxByte(rxbyte);

}

//从串口发送数据
void QTPortDebug::SerialWrite()
{        
     //发送ASCII字符
    if(ui->radio_send_ascii->isChecked())
    {
        //读取要发送的数据
        QString sendData = ui->text_write->toPlainText();

        displaysend(sendData);
        //Unicode转GBK 参考博客问答http://bbs.csdn.net/topics/390024555
        QTextCodec * codec = QTextCodec::codecForName("GBK"); //建立一个unicode与GBK之间的转换器
        QByteArray bytesForGBK = codec->fromUnicode(sendData); //unicode转换成gbk
        //发送数据
        SPort->write(bytesForGBK);

        txbyte  = bytesForGBK.length();//发送字节数累加

    }
    //发送16进制字符
    else if(ui->radio_send_hex->isChecked())
    {
        //读取要发送的数据
        QString sendData = ui->text_write->toPlainText();
        //是否显示发送消息
        displaysend(sendData);
       // HexToString
        QByteArray sendbuff;
        //方法一
        QStringtoHex(sendbuff,sendData);
        //方法二
        //sendbuff = QByteArray::fromHex(sendData.toLatin1().data());
        SPort->write(sendbuff);
    }
    //显示发送的字节数
    displayTxByte(txbyte);

}
//打开和关闭串口
void QTPortDebug::on_startbutton_clicked()
{
    if(tr("打开串口") == ui->startbutton->text())
    {

        //写配置信息
        configiniWrite();

        ui->startbutton->setText(tr("关闭串口"));
        getComboBoxValue();
        setPortConfig();
        //收到数据运行槽函数
        if(runonce)//只允许运行一次
        {
           connect(SPort,SIGNAL(readyRead()),this,SLOT(SerialRead()));
        }
        portstatus->setText(tr("Open SerialPort"));
        //statusBar()->addWidget(portstatus);
    }
    else
    {
        //autorun = false;
        //disconnect(SPort);
        runonce = false;

        ui->startbutton->setText(tr("打开串口"));
        SPort->close();

        portstatus->setText("Closed SerialPort");
        //statusBar()->addWidget(portstatus);
        //关闭定时器
        if(timer->isActive())//当定时器已启动
        {
             timer->stop();
        }

    }
}

void QTPortDebug::on_sendbutton_clicked()
{
    if(SPort->isOpen())
    {
        addrecord();//将发送的信息添加到下啦框
        SerialWrite();
        if(ui->check_repsend->isChecked()&&!timer->isActive())//判读定时器未启动
        {
            timer->start(time_cycle);                   //定时器开始计时,其中1000表示1000ms即1秒
        }
    }
    else{
        QMessageBox::warning(this,tr("warning"),tr("亲,请点击继续按钮或打开串口"));
    }

}
//获取当前路径并创建ini对象
void QTPortDebug::config()
{
    setcurrentPath();
    configini = new QSettings(PATH, QSettings::IniFormat);
}
//从ini文件读取并设置为上次配置
void QTPortDebug::configiniRead()
{
    configini->beginGroup("SETUP");
    int i_m_port = configini->value("COM").toInt();
    int i_m_baudrate = configini->value("baudrate").toInt();
    int i_m_databit = configini->value("databit").toInt();
    int i_m_check = configini->value("check").toInt();
    int i_m_stopbit = configini->value("stopbit").toInt();
    int i_m_FlowControl = configini->value("flow").toInt();
    configini->endGroup();

    ui->CB_port->setCurrentIndex(i_m_port);
    ui->CB_baudrate->setCurrentIndex(i_m_baudrate);
    ui->CB_databit->setCurrentIndex(i_m_databit);
    ui->CB_check->setCurrentIndex(i_m_check);
    ui->CB_stopbit->setCurrentIndex(i_m_stopbit);
    ui->CB_flow->setCurrentIndex(i_m_FlowControl);
}
//将配置信息写入ini文件
void QTPortDebug::configiniWrite()
{
    configini->beginGroup("SETUP");
    configini->setValue("COM",ui->CB_port->currentIndex());
    configini->setValue("baudrate",ui->CB_baudrate->currentIndex());
    configini->setValue("databit",ui->CB_databit->currentIndex());
    configini->setValue("check",ui->CB_check->currentIndex());
    configini->setValue("stopbit",ui->CB_stopbit->currentIndex());
    configini->setValue("flow",ui->CB_flow->currentIndex());
    configini->endGroup();
}
//将发送的文本添加到记录
void QTPortDebug::addrecord()
{
    QString str = ui->text_write->toPlainText();
    ui->cb_record->insertItem(0,str);
}
//将记录填充到发送文本框
void QTPortDebug::fillrecord()
{
    ui->text_write->clear();
    QString str = ui->cb_record->currentText();
    ui->text_write->insertPlainText(str);
}
//接收区显示信息
void QTPortDebug::message(QString str)//重载
{
    ui->text_accept->insertPlainText(str);

    QTextCursor cursor = ui->text_accept->textCursor();//将光标移动到文本末尾
    cursor.movePosition(QTextCursor::End);
    ui->text_accept->setTextCursor(cursor);

}

/*void QTPortDebug::message(QString &str)//重载
{
    ui->text_accept->insertPlainText(str);

}*/

char QTPortDebug::ConvertHexChar(char c)
{
    if(c>='a'&&c<='f')
    {
        return c-'a' 10;
    }
    else if(c>='A'&&c<='F')
    {
        return c-'A' 10;
    }
    else if(c>='0'&&c<='9')
    {
        return c-'0';
    }
    else{
        return -1;
    }
}
void QTPortDebug::QStringtoHex(QByteArray& sendData,QString str)
{
    char hstr,lstr,hdata,ldata;
    int len = str.length();
    int sendnum = 0;
    QByteArray temp;
    temp.resize(len/2);//设置大小,len/2会大于实际16进制字符
    //sendData.resize(len/2);
    for(int i=0;i<len;)
    {
        //hstr = str[i].toAscii();
        hstr = str[i].toLatin1();
        if(hstr == ' ')
        {
              i;
            continue;
        }
          i;
        if(i >= len)
        {
            break;
        }
        lstr = str[i].toLatin1();

        hdata = ConvertHexChar(hstr);
        ldata = ConvertHexChar(lstr);
        if(-1 == hdata || -1 == ldata)
        {
            break;
        }
          i;
        temp[sendnum] = hdata<<4|ldata;
        sendnum  ;
    }
    sendData.reserve(sendnum);
    sendData = temp.left(sendnum);//去掉多余字符
}
void QTPortDebug::CheckAutoRun()
{
    if(SPort->isOpen())
    {
        if(ui->check_repsend->isChecked())
        {
            if(!timer->isActive())
            {
                timer->start(time_cycle);                   //定时器开始计时,其中1000表示1000ms即1秒
            }
        }
        else
        {
            if(timer->isActive())
            {
                timer->stop();

            }
        }
    }
    else{
        QMessageBox::warning(this,tr("warning"),tr("please open SerialPort"));
        ui->check_repsend->setChecked(false);
    }

}

void QTPortDebug::sendupdata()
{
    SerialWrite();
}

void QTPortDebug::displaysend(QString & str)
{
    if(ui->check_display_send->isChecked())
    {
        if(DisplayTimeStatus)
        {
            message(currenttime->currentTime().toString("[hh:mm:ss.zzz]"));
        }
        message(tr("Send data:"));
        message(str);
        message(tr("\r\n"));
    }
}

void QTPortDebug::initStatusbar()
{
    portstatus = new QLabel;
    portstatus->setMinimumSize(120,20);
    portstatus->setAlignment(Qt::AlignLeft);
    statusBar()->addWidget(portstatus);

    rx = new QLabel("RX:");
    rx->setMinimumSize(50,20);
    rx->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(rx);

    rxnum = new QLabel("0");
    rxnum->setMinimumSize(50,20);
    rxnum->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(rxnum);

    byterx = new QLabel("bytes");
    byterx->setMinimumSize(50,20);
    byterx->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(byterx);

    tx = new QLabel("TX:");
    tx->setMinimumSize(50,20);
    tx->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(tx);


    txnum = new QLabel("0");
    txnum->setMinimumSize(50,20);
    txnum->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(txnum);

    bytetx = new QLabel("bytes");
    bytetx->setMinimumSize(50,20);
    bytetx->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(bytetx);
    //设置无边框
    statusBar()->setStyleSheet(QString("QStatusBar::item{border: 0px}"));

}

void QTPortDebug::displayRxByte(unsigned int rxbyte)
{
    QString str = QString::number(rxbyte);
    rxnum->setText(str);

}
void QTPortDebug::displayTxByte(unsigned int txbyte)
{
    QString str = QString::number(txbyte);
    txnum->setText(str);
}

void QTPortDebug::on_Clear_clicked()
{
    rxbyte = 0;//接收字节数
    txbyte = 0;//发送字节数

    rxnum->setText("0");//显示接收字节数0
    txnum->setText("0");//显示发送字节数0

    ui->text_accept->clear();
    ui->text_write->clear();
}

void QTPortDebug::on_sendtime_valueChanged(int arg1)
{
    time_cycle = arg1;
    if(timer->isActive())
    {
        //改变定时时间间隔
        timer->setInterval(time_cycle);
    }
}

void QTPortDebug::on_displaytime_stateChanged(int arg1)
{
    if(ui->displaytime->isChecked())
    {
        DisplayTimeStatus = true;//显示时间

    }
    else{
        DisplayTimeStatus = false;
    }
}


void QTPortDebug::on_pause_clicked()
{
//    if(tr("暂  停") == ui->pause->text())
//    {
//        if(timer->isActive())
//        {
//            timer->stop();
//        }
//        if(SPort->isOpen())
//        {
//            SPort->close();
//        }
//        ui->pause->setText(tr("继  续"));
//    }
//    else{
//        if(!timer->isActive())
//        {
//            timer->start();
//        }
//        if(!SPort->isOpen())
//        {
//            setPortConfig();
//        }
//        ui->pause->setText(tr("暂  停"));
//    }

}
void QTPortDebug::setground()
{
    palette.setColor(QPalette::Background,QColor(85, 85, 125));
    this->setPalette(palette);
}

标签: 串口 调试工具

实例下载地址

qt 串口调试工具源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警