Qt_c++上位机2套串口实时曲线带平滑 1,设置串口. 2,串口收发数据。 3,数据模拟。 4,接收数据形成曲线。 5,曲线控件的各种外观设置。 6,可以设置平滑曲线。 参数如下: ----------------------------- 1)编程语言:C++ (11或以上); ----------------------------- 2)编程环境:QT5.14; ----------------------------- 3)编程工具1:qss ; ----------------------------- 4)编译器:msvc ;(没有就完整安装2019,一定要选msvc,或 安装 WIN10 SDK) ----------------------------- 5)数据库:__ ----------------------------- 6)如何加载pro文件文件->打开文件或项目; 在Build&Run 下选择 Qt 5.14.2 msvc2017(或2015) 左侧边栏点击项目,右边概要下的Shadow build 不用勾选; ----------------------------- 7) SDK需要安装win10SDK(编译或调试要用) ----------------------------- 8) 构建记得先qtmake, 再点击重新构建 -----------------------------

最近搞了个Qt上位机,支持双串口同时收发数据+实时曲线绘制+曲线平滑,实测效果挺丝滑。分享几个关键点和代码片段,避免大伙儿踩坑。


一、串口双开与数据狂飙

双串口需要两个QSerialPort实例,别共用同一个对象(血泪教训)。初始化时绑定不同COM口:

// 串口1初始化
m_serial1 = new QSerialPort(this);
m_serial1->setPortName("COM3");
m_serial1->setBaudRate(QSerialPort::Baud115200);
connect(m_serial1, &QSerialPort::readyRead, [=](){ handleData(m_serial1); });

// 串口2同理,注意别用同一个对象名

数据接收直接用readyRead信号触发,但注意二进制数据文本数据处理差异。这里用了个lambda区分数据来源:

void MainWindow::handleData(QSerialPort *port) {
    QByteArray rawData = port->readAll();
    // 解析数据,转成数值存队列
    double value = rawData.toDouble(); // 根据协议实际调整
    dataQueue[port].enqueue(value); // 用哈希表区分数据源
}

二、曲线绘制的骚操作

推荐用QCustomPlot库(比Qt自带的QChart更轻量)。关键代码:

// 初始化两条曲线
ui->customPlot->addGraph();
ui->customPlot->addGraph();
// 设置曲线颜色
ui->customPlot->graph(0)->setPen(QPen(Qt::blue));
ui->customPlot->graph(1)->setPen(QPen(Qt::red));

实时刷新别用定时器!直接在数据接收后触发重绘:

// 数据到达时
if(dataQueue.size() > 100) dataQueue.dequeue(); // 限制数据长度
ui->customPlot->graph(0)->addData(timeStamp, value);
ui->customPlot->xAxis->setRange(timeStamp-10, timeStamp); // X轴动态跟随
ui->customPlot->replot(QCustomPlot::rpQueuedReplot); // 异步重绘防卡顿

三、曲线平滑的玄学

平滑算法试过移动平均和贝塞尔,最终选了加权平均,代码更简单:

double smoothValue = 0.0;
const double alpha = 0.2; // 平滑系数

// 收到新数据时处理
smoothValue = alpha * rawValue + (1 - alpha) * smoothValue;

想要更丝滑?上双缓冲队列

QVector<double> buffer;
while(!dataQueue.empty()) {
    buffer.append(dataQueue.dequeue());
    if(buffer.size() >= 5) { // 5点滑动窗口
        double avg = std::accumulate(buffer.begin(), buffer.end(), 0.0) / 5;
        smoothedData.enqueue(avg);
        buffer.removeFirst();
    }
}

四、颜值即正义:qss魔改

曲线控件的美化藏在qss里:

/* customplot.css */
QCustomPlot {
    background-color: #1E1E1E;
    border: 1px solid #3A3A3A;
    border-radius: 5px;
}
QCPAxis::label {
    color: #CCCCCC;
    font: 10pt "Segoe UI";
}
QCPGraph {
    selection-color: #FFA000; /* 选中高亮色 */
}

避坑指南:

  1. 编译必装Win10 SDK(装Qt时勾选MSVC2017)
  2. Shadow build千万取消!项目配置里去掉勾选,否则找不到资源文件
  3. 改完.pro文件必点qmake再构建,否则新增文件不生效
  4. 串口调试建议先开虚拟串口工具模拟数据

完整代码已扔Github(地址私),遇到问题欢迎拍砖。搞上位机嘛,核心就八字诀:数据不丢,界面不卡

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐