手撸Qt实时曲线:两套串口数据平滑处理实战
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文件文件->打
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; /* 选中高亮色 */
}
避坑指南:
- 编译必装Win10 SDK(装Qt时勾选MSVC2017)
- Shadow build千万取消!项目配置里去掉勾选,否则找不到资源文件
- 改完.pro文件必点qmake再构建,否则新增文件不生效
- 串口调试建议先开虚拟串口工具模拟数据
完整代码已扔Github(地址私),遇到问题欢迎拍砖。搞上位机嘛,核心就八字诀:数据不丢,界面不卡。







更多推荐



所有评论(0)