[活动专区] 【Autochips评测】Part3:QT上位机设计

[复制链接]
 楼主| w494143467 发表于 2021-3-10 17:18 | 显示全部楼层 |阅读模式
本帖最后由 w494143467 于 2021-3-11 09:09 编辑

1.介绍
上一篇说明了Demo的设计方案,今天这一篇就专门来写一个上位机,主要分为数据显示和数据通信部分,同时通过波形图显示出当时的速度,同时还需要设计一下与下位机的通信协议,这个只做一个简单的设计,因为通信的内容不多,所以采用简单的方案。
2.界面设计
对电机的主要设计四个按钮【开始】、【停止】、【正转】和【反转】,同时有一个滑杆用于控制速度,速度波形图采用QWT插件中的【QwtPlot】控件,如下图1所示。

0_0.png

图1

界面设计完成如下图2所示。

0.png

图2

这里创建一个类来对串口进行扫描,这样就可以动态的选择插入的串口设备了,代码如下所示。
  1. //默认构造
  2. SerialPortList::SerialPortList()
  3. {
  4.     timer = new QTimer;
  5.     scanCycleMs = 1000;
  6.     oldPortStringList.clear();
  7.     connect(timer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
  8. }

  9. //自定义扫描周期构造
  10. SerialPortList::SerialPortList(quint16 CycleMs)
  11. {
  12.     timer = new QTimer;
  13.     scanCycleMs = CycleMs;
  14.     oldPortStringList.clear();
  15.     connect(timer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
  16. }

  17. SerialPortList::~SerialPortList()
  18. {
  19.     delete timer;
  20. }

  21. //开始扫描
  22. void SerialPortList::ScanStart()
  23. {
  24.     timer->stop();
  25.     timer->start(scanCycleMs);
  26. }

  27. //停止扫描
  28. void SerialPortList::ScanStop(){
  29.     timer->stop();
  30. }

  31. //周期扫描服务
  32. void SerialPortList::onTimeOut(){

  33.     QStringList newPortStringList;
  34.     //搜索串口
  35.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
  36.       #if DEBUG_INFOR_EN
  37.         qDebug() << "Name        : " << info.portName();
  38.         qDebug() << "Description : " << info.description();
  39.         qDebug() << "Manufacturer: " << info.manufacturer();
  40.       #endif
  41.       newPortStringList += info.portName();
  42.     }

  43.     //更新旧的串口列表
  44.     if(newPortStringList.size() != oldPortStringList.size())
  45.     {
  46.         oldPortStringList = newPortStringList;
  47.         emit onNewSerialPort(oldPortStringList);
  48.     }
  49. }
然后创建自定义的串口扫描类,再添加上串口通信对象,同时绑定串口接收信号槽,最后设置一下波形图的上下限,初始化代码如下所示。
  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);

  6.     serial = new QSerialPort;   //声明对象
  7.     curve = new QwtPlotCurve();

  8.     portList = new SerialPortList(200); //创建串口数据
  9.     QObject::connect(portList, SIGNAL(onNewSerialPort(QStringList)), this, SLOT(onNewPortList(QStringList)));

  10.     QObject::connect(serial,SIGNAL(readyRead()), this, SLOT(SerialReadData()),Qt::UniqueConnection);  //绑定串口接收服务信号槽

  11.     ui->qwtPlot->setAxisScale(QwtPlot::xBottom, 0, 100);
  12.     ui->qwtPlot->setAxisScale(QwtPlot::yLeft, 0, 100);

  13.     portList->ScanStart();  //开始串口扫描
  14. }
最后实现按钮发送字符串,接收串口过来的数据即可,接收的处理函数如下所示。
  1. /*
  2.     0~100:速度
  3.     255:反转
  4.     254:正转
  5.     253:停止
  6.     252:开始
  7. */
  8. void MainWindow::SerialReadData()
  9. {
  10.     QByteArray readArray = serial->readAll();
  11.     quint8 readInt = quint8(readArray.at(0));
  12.     if(readInt <= 100)   //小于100是速度
  13.     {
  14.         ui->lblMotorSpeed->setText(QString::number(readInt, 10) + "km/h");
  15.         xdata.append(xdata.size()+1);
  16.         ydata.append(readInt);
  17.         curve->setSamples(xdata,ydata);
  18.         curve->attach(ui->qwtPlot);
  19.         ui->qwtPlot->replot();
  20.     }
  21.     else if(readInt == 252)
  22.     {
  23.         ui->lblMotorState->setText("开始");
  24.     }
  25.     else if(readInt == 253)
  26.     {
  27.         ui->lblMotorState->setText("停止");
  28.     }
  29.     else if(readInt == 254)
  30.     {
  31.         ui->lblMotorDirection->setText("正转");
  32.     }
  33.     else if(readInt == 255)
  34.     {
  35.         ui->lblMotorDirection->setText("反转");
  36.     }
  37. }
发送的就根据协议进行发送即可,运行后的界面如下图3所示。

1.png

图3

接收一定数据后的波形图如下图4和图5所示。

2.png
图4
2.png
图5

3.总结
上位机基本可以说是完成了,就剩下位机的程序+联调了,上位机设计还是比较简单的,如果设计好了,给大家录一个视频看看,分享一下上位机的程序,不过需要安装QWT插件,大家自行百度哈,如果真的需要安装教程,我后面出一个,希望大家能够继续支持我哈!
下位机程序:
游客,如果您要查看本帖隐藏内容请回复

weict125 发表于 2021-3-10 19:44 | 显示全部楼层
可以自动检测断开和连接吗?
 楼主| w494143467 发表于 2021-3-10 22:07 | 显示全部楼层
weict125 发表于 2021-3-10 19:44
可以自动检测断开和连接吗?

这目前个程序不能,不过也容易做。
JasonLee27 发表于 2021-3-11 10:59 | 显示全部楼层
厉害了吖,电机运行过程不能仿真,通过上位机实时检测很不错
rongwinzip 发表于 2021-3-11 13:23 | 显示全部楼层
回复看一下吧
merry_zsp 发表于 2021-3-11 18:27 | 显示全部楼层
楼主果然是上位机的专家这么轻松的就做出一个软件了
真爱吴迪迪 发表于 2021-3-11 18:30 | 显示全部楼层
这个太棒了,标记一下,收藏。
cliflandcn 发表于 2021-3-11 21:01 | 显示全部楼层
代码内容看不懂,但是代码的编码风格很规范,可读性好。
chenqianqian 发表于 2021-3-12 07:09 来自手机 | 显示全部楼层
谢谢楼主分享,不错。
cr315 发表于 2021-3-12 11:02 | 显示全部楼层
很不错哟,MARK
zhanxiao 发表于 2021-3-19 16:10 | 显示全部楼层
楼主好样的!
zhengtiantong 发表于 2021-3-20 10:02 | 显示全部楼层
感觉停棒的,不知道C#能不能做出来,最近在啃
 楼主| w494143467 发表于 2021-3-20 10:34 | 显示全部楼层
zhengtiantong 发表于 2021-3-20 10:02
感觉停棒的,不知道C#能不能做出来,最近在啃

C#肯定可以的!
hjq451506709 发表于 2021-3-28 17:49 | 显示全部楼层
谢谢分享哈
wwppd 发表于 2021-4-6 21:39 | 显示全部楼层
qt creator吗  
jkl21 发表于 2021-4-6 21:39 | 显示全部楼层
只会一点C#     
iyoum 发表于 2021-4-6 21:39 | 显示全部楼层
下载看看资料吧。   
uytyu 发表于 2021-4-6 21:39 | 显示全部楼层
怎么约定的通信协议吗
touser 发表于 2021-4-6 21:40 | 显示全部楼层
这个是画图吗
pklong 发表于 2021-4-6 21:40 | 显示全部楼层
串口的控件是哪个?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

300

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部