**使用QT在串口调试助手基础上实现波形显示(含源码)
评论比较多留言需要源码的,逐个发邮箱比较麻烦也不能及时回复,现将源码上传至链接(无需积分下载)https://download.csdn.net/download/m0_51294753/87743394,下载不下来可以私信我留邮箱。
一、前言
背景:使用ADS1255对模拟信号进行采样,并将转换的数据通过串口发送给电脑,使用QT编写上位机软件接收串口数据并实现采样波形的显示。因为没有具体的需求,只是进行简单测试,程序不尽完善,简单记录一下过程,方便刚接触的同伴一起学习。
二、测试效果
界面是在串口助手基础上改的,具有串口调试助手的基本功能,加了一个折线图显示,但是重新整理了上次串口的程序,显示效果如下:
20230302_104834

采样的板子设计的不太好,模拟输入端开路时本底噪声基本在0.6mV左右,设计输入电压是±2.5V。采用的串口输入,波特率为1500000,输入的数据具有固定的格式,数据输入形式如下:

三、实现过程遇到的问题
使用QT的serialport 和 charts库,简单过程不再说明,源程序在文末给出,下面简述一下我在实现中遇到的问题:
1.串口的定时扫描和串口名更新
原本只在程序开始时进行串口扫描,但随后发现如果设备在程序运行后就检测不到串口,串口如果被占用也得不到更新。通过定时器和关联槽函数来定时(500ms)扫描串口,但是串口禁用那行代码还没整明白是怎么回事(有知道的欢迎在评论区告诉我),具体实现看源代码。
for(int i = 0;i<portStringList.size();i++)
{
serial->setPortName(portStringList[i]);
if(serial->open(QIODevice::ReadWrite))
ui->comboSerialPort->addItem(portStringList.at(i));
else
{
ui->comboSerialPort->addItem(portStringList.at(i) + "(不可用)");
ui->comboSerialPort->setItemData(i,(QVariant)0,Qt::UserRole-1); //串口禁用??
}
serial->close();
}
2.图表显示的内容需要移动,类似示波器的显示波形
对于横坐标,我是通过固定横坐标时间的宽度,改变横坐标的坐标范围来实现的,比如数据输出速率为10,固定横坐标只显示50个点,则设置横坐标宽度为5。
t += 0.1;
qreal value = valueStr.toDouble();
serices0->append(t,value);
if(t>50)
axisX->setRange(t-50,t);
对于纵坐标,通过一个链表把图表显示的50个数据存储起来,再用类似队列的方式先入先出的方式更新队列,找出队列的最大值和最小值更新纵坐标的坐标范围
if(listvalue.size()<=500)
listvalue.push_front(value);
else
{
listvalue.pop_back();
listvalue.push_front(value);
}
qreal minvalue = *std::min_element(listvalue.begin(),listvalue.end());
qreal maxvalue = *std::max_element(listvalue.begin(),listvalue.end());
axisY->setRange(minvalue-0.00001,maxvalue+0.00001);
3.把数据从发送的字符串中截取出来显示
没想到太好的办法,目前是需要注意发送字符串的形式,按着字符串形式更改程序,比如下位机发送的类型是value:0.0000000V,可以利用字符串截取函数把中间的数据单独拿出来,因为我下位机发送的数据宽度固定,所以我是使用mid()函数直接截取,如果长度 不一致,也可以用split()函数将数据与文本割裂开。
receiveBuff = serial->readAll();
receiveBytes += receiveBuff.length();
QByteArray valueStr;
valueStr = receiveBuff.mid(QString("value:").size(),QString("-0.000000").size());
4.设置坐标轴的问题
给图表中序列赋

本文介绍了一种使用QT框架,在串口调试助手基础上增加波形显示功能的方法。作者通过QT的serialport和charts库实现了串口数据接收及波形绘制,详细讨论了定时扫描串口、动态更新图表、数据解析以及坐标轴设置等关键步骤,并提供了源代码供读者参考。文章适合初学者学习串口通信和QT图形界面编程。
&spm=1001.2101.3001.5002&articleId=129306887&d=1&t=3&u=2abd34cafb85445d83b7660005ce6e7b)
132

被折叠的 条评论
为什么被折叠?



