IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 使用QT实现串口收发和波形显示 -> 正文阅读

[C++知识库]使用QT实现串口收发和波形显示

功能介绍

HI,大家好,今天给大家分享一个最近做的小项目,一个使用QT实现类似串口调试助手功能的作品。不过相对于常见的串口调试助手,增加了波形显示的功能。波形显示部分借鉴了这篇博客链接: link.非常感谢这位大佬,写得很详细。还有也借鉴了一些其他博主的经验,非常感谢。

代码实现

首先在工程文件.pro中添加serialport和charts,就可以使用QT集成的串口和图表绘制的功能函数

     QT += core gui serialport charts

接着对UI界面进行一个简单的设计
UI界面设计
在Widget构造函数中添加以下代码`

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QStringList serialNamePort;
    serialPort = new QSerialPort(this);

    connect(serialPort,SIGNAL(readyRead()),this,SLOT(serilaPortReadyRead_Slot()));   /*手动关联读取函数*/

    /*获取存在的串口名*/
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) {
        serialNamePort<<info.portName();
    }
    ui->seialCb->addItems(serialNamePort);

    /*关联定时器和绘图函数*/
    timer = new QTimer(this);
    connect(timer , SIGNAL(timeout()) , this , SLOT(DrawLine()));
}

串口初始化以及绘图初始化函数的调用(包括了定时器初始化,定时器用于绘制数据的动态更新)

/*串口初始化配置*/
void Widget::on_openBT_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::StopBits stopBits;
    QSerialPort::Parity checkBits;

    /*波特率*/
    if(ui->baundrateCb->currentText() == "9600")
    {
        baudRate = QSerialPort::Baud9600;
    }
    else if(ui->baundrateCb->currentText() == "115200")
    {
        baudRate = QSerialPort::Baud115200;
    }

    /*数据位*/
    if(ui->dataCb->currentText() == "6")
    {
        dataBits = QSerialPort::Data6;
    }
   else if(ui->dataCb->currentText() == "7")
    {
        dataBits = QSerialPort::Data7;
    }
    else if(ui->dataCb->currentText() == "8")
    {
        dataBits = QSerialPort::Data8;
    }

    /*停止位*/
    if(ui->stopCb->currentText() == "1")
    {
        stopBits = QSerialPort::OneStop;
    }
    else if(ui->stopCb->currentText() == "1.5")
    {
        stopBits = QSerialPort::OneAndHalfStop;
    }
    else if(ui->stopCb->currentText() == "2")
    {
        stopBits = QSerialPort::TwoStop;
    }

    /*校验位*/
    if(ui->checkCb->currentText() == "none")
    {
        checkBits = QSerialPort::NoParity;
    }
    
    //设置
    serialPort->setPortName(ui->seialCb->currentText());
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(checkBits);

    if(serialPort->open(QIODevice::ReadWrite) == true)
    {
        QMessageBox::information(this,"提示","成功");
    }
    else
    {
        QMessageBox::critical(this,"提示","失败");
    }

    //画图初始化
    initDraw();
    timer->start();  //初始化定时器
    timer->setInterval(1000);
}

画图初始化函数

/*画图初始化*/
void Widget::initDraw()
{
    QPen peny(Qt::darkRed , 3 , Qt::SolidLine , Qt::RoundCap , Qt::RoundJoin);
    chart = new QChart();
    series = new QSplineSeries();
    axisX = new QDateTimeAxis();
    axisY = new QValueAxis();

    chart->legend()->hide();        //隐藏图例
    chart->addSeries(series);       //将线添加到chart中
    axisX->setTickCount(10);   //设置x坐标轴格数
    axisY->setTickCount(5);     //设置y坐标轴格数

    axisX->setFormat("hh:mm:ss");       //设置显示格式
    axisY->setMin(0);       //设置y轴范围
    axisY->setMax(1000);
    axisX->setTitleText("T");    //设置x轴名称
    axisY->setLinePenColor(QColor(Qt::darkBlue));       //设置坐标轴颜色样式
    axisY->setGridLineColor(QColor(Qt::darkBlue));
    //axisY->setGridLineColor(QColor(Qt::darkBlue));
    axisY->setGridLineVisible(false);        //设置y轴网格不显示
    axisY->setLinePen(peny);
    axisX->setLinePen(peny);

    chart->addAxis(axisX , Qt::AlignBottom);    //设置坐标轴位于chart中的位置
    chart->addAxis(axisY , Qt::AlignLeft);

    series->attachAxis(axisX);          //把数据添加到坐标轴上
    series->attachAxis(axisY);

    axisY->setTitleText("Y");

    //把chart显示到窗口上
    ui->widget->setChart(chart);
    ui->widget->setRenderHint(QPainter::Antialiasing);   //设置抗锯尺

}

串口接收槽函数,下位机发送格式需为 abc数据\r\n 才能正常接收

/*串口接收槽函数*/
void Widget::serilaPortReadyRead_Slot()
{
    QString num;
    QString recv_buf;  //接收缓存
    QString buf;
    int recv_pos = 0;  //移位
    
    recv_buf = QString(serialPort->readAll());  //接收数据
    buf = recv_buf.mid(4);
    if( recv_buf.indexOf("abc") != -1)   //判断是否有abc
    {  
        num=recv_buf.mid(recv_pos,recv_buf.length()); //截取出字符大小
        recv_pos=num.indexOf("\r\n");   //找出数据尾部标志的recv_pos值
        num=num.mid(3,recv_pos-3);      //截取数据
        number=num.toInt();  //将char型数据转为int型数据
        qDebug()<<number;
    }
}

串口发送槽函数,发送格式为字符发送+发送新行

/*串口发送槽函数*/
void Widget::on_sendBt_clicked()
{
    QByteArray Data_1 = ui->sendEdit->text().toUtf8();
    Data_1.append("\r\n");
    serialPort->write(Data_1);

}

画图函数

/*画图函数*/
void Widget::DrawLine()
{

    QDateTime currentTime = QDateTime::currentDateTime();     //设置坐标轴显示范围

    chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-60*1));    //系统当前时间的前一秒
    chart->axisX()->setMax(QDateTime::currentDateTime().addMSecs(0));       //系统当前时间

    series->append(currentTime.toMSecsSinceEpoch() , number);     //将数据在坐标轴中画成曲线

}

经过测试,能够正常收发并显示数据。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 13:42:06  更:2022-01-01 13:44:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:53:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码