QT三驾马车(一)——实现上位机(串口数据发送和接收)

这篇具有很好参考价值的文章主要介绍了QT三驾马车(一)——实现上位机(串口数据发送和接收)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以后同学们做项目一定会用到QT的三驾马车,QT的三驾马车即QT的串口编程,QT的网络编程和QT的GPIO,今天我们通过一个项目来介绍第一部分,QT的串口编程。

之前看过很多相关的文章,但是按照顺序来编译总是会出错,可是我自己还找不到原因,对于我这种新手小白来说极其不友好,看了网上的一个老师讲的视频,感觉讲的很好,所以今天我来写一篇针对刚开始学习QT的同学实现上位机的一个步骤呀,每个步骤都会有对应的解释,最后有源码,大家可以尝试一块练习一下呀。

现在我们来实现一个具体的串口助手:

一.新建项目

qt上位机,qt,开发语言,c++

qt上位机,qt,开发语言,c++

二.设计UI界面

 这是设计页面最终的一个效果,非常简单,就是一个控件的布局,大家不要懵,我们一块来做一下。

qt上位机,qt,开发语言,c++

 (1)首先是控件的选择:

最上面是一个接受框: Plain Text edit   qt上位机,qt,开发语言,c++

左下角是属性(即端口的选择和波特率检验位等): Combo boxqt上位机,qt,开发语言,c++

属性右边用的是:QLabel  qt上位机,qt,开发语言,c++

自制串口助手: Group Box qt上位机,qt,开发语言,c++去掉上面的字在里面添加一个QLabel即可

发送框 :Line edit  qt上位机,qt,开发语言,c++

 打开串口, 关闭串口,发送串口,清空: Push Button qt上位机,qt,开发语言,c++

 (2)对控件进行布局

左下属性:进行一个栅格布局

右下三部分进行一个垂直布局

整体进行一个栅格布局即可

可以适量加入弹簧来使整体界面更加美观一些

(3)对控件进行改名字操作

因为这样方便后续我们在程序中对控件进行操作,也方便别人和自己阅读,起名一定要做到见名知意,而且要简洁。对于一些不用做后续操作的控件,我们不对他们进行命名。

属性的命名如下(QcomoBox):

qt上位机,qt,开发语言,c++

 按钮的命名(QPushButton):

qt上位机,qt,开发语言,c++

 接收框和发送框:

qt上位机,qt,开发语言,c++

 为属性添加值(双击属性框,弹出,点左下角加号):

先为波特率及下面的属性添加值,串口号一会用程序来添加。

qt上位机,qt,开发语言,c++

 三.程序设计

(1)在pro工程文件中:

qt上位机,qt,开发语言,c++

QT       += core gui serialport

(2)在h文件中:

#include<QSerialPort>


 QSerialPort *serialport;

(3)在cpp文件中:

首先包含一个头文件

然后用QSerialPortInfo::availablePorts()函数搜索可用串口,将串口放入定义的数组中并在ui serialCb显示。(这一步的目的是为串口号属性添加值)

#include<QSerialPortInfo>

QStringList serialNamePort;

    serialport = new QSerialPort(this);

    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
    serialNamePort<<info.portName();
}
     ui->serialCb->addItems(serialNamePort);
}

(4)为按键添加相应的槽函数

右键按键转到槽,这就是QT的自动关联。

  1. 打开按键功能:串口的初始化
void Widget::on_openBt_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::StopBits stopBits;
    QSerialPort::Parity checkBits;

    if(ui->baundrateCb->currentText()=="4800"){
        baudRate=QSerialPort::Baud4800;
    }else if(ui->baundrateCb->currentText()=="9600"){
        baudRate=QSerialPort::Baud9600;
    }else if(ui->baundrateCb->currentText()=="115200"){
        baudRate=QSerialPort::Baud115200;
    }

    if(ui->dataCb->currentText()=="5"){
        dataBits=QSerialPort::Data5;
    } else 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->serialCb->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,"提示","失败");
  }
}

 2.关闭串口

void Widget::on_closeBt_clicked()
{
    serialport->close();
}

3.串口收发

接收:

.h文件 槽函数

 void serialportReadyRead_Slot();
    

.cpp文件 关联槽函数

 connect(serialport,SIGNAL(readyRead()),this,SLOT(serialportReadyRead_Slot()));

定义槽函数

void Widget::serialportReadyRead_Slot()
{
    QString buf;
    buf=QString(serialport->readAll());
    ui->recvEdit->appendPlainText(buf);
     
}

发送:

void Widget::on_sendBt_clicked()
{
    serialport->write(ui->sendEdit->text().toLocal8Bit().data());
}

4.清空

void Widget::on_clearBt_clicked()
{
 ui->recvEdit->clear();
}

四.源码

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QSerialPort>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QSerialPort *serialport;

private slots:
    void on_openBt_clicked();

    void on_clearBt_clicked();

    void on_closeBt_clicked();

    void serialportReadyRead_Slot();

    void on_sendBt_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include<QSerialPortInfo>
#include<QMessageBox>
#include<QString>

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(serialportReadyRead_Slot()));

    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
    serialNamePort<<info.portName();
}
     ui->serialCb->addItems(serialNamePort);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::serialportReadyRead_Slot()
{
    QString buf;
    buf=QString(serialport->readAll());
    ui->recvEdit->appendPlainText(buf);

}
void Widget::on_openBt_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::StopBits stopBits;
    QSerialPort::Parity checkBits;

    if(ui->baundrateCb->currentText()=="4800"){
        baudRate=QSerialPort::Baud4800;
    }else if(ui->baundrateCb->currentText()=="9600"){
        baudRate=QSerialPort::Baud9600;
    }else if(ui->baundrateCb->currentText()=="115200"){
        baudRate=QSerialPort::Baud115200;
    }

    if(ui->dataCb->currentText()=="5"){
        dataBits=QSerialPort::Data5;
    } else 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->serialCb->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,"提示","失败");
  }
}

void Widget::on_clearBt_clicked()
{
 ui->recvEdit->clear();
}

void Widget::on_closeBt_clicked()
{
    serialport->close();
}



void Widget::on_sendBt_clicked()
{
    serialport->write(ui->sendEdit->text().toLocal8Bit().data());
}

五.封装程序

这样一个基于QT的串口助手就完成啦,下面我们将它封装起来,以便于他人的使用,因为在以后我们开发软件时,我们不能直接让他人下载QT creator,另一方面,我们的源码也不是可以随便给别人的,所以我们要将做好的程序打包封装,把写好的程序发给用户来用。

下面介绍封装的步骤:

(1)把工程切换到release模式,然后编译。

(2)找到release模式构建的文件夹

(3)改一下图标 可以使用easyicon 网站来找图标  .ico格式

     把图标放到工程文件里面去,就是serial下面,和.h.cpp同级。

在pro里面加入这一句话即可。

RC_ICONS=serial.ico

(4)封包操作 

需要用到QT的控制台

qt上位机,qt,开发语言,c++

在电脑桌面上建立一个文件夹,将工程release文件(在建立的文件夹里面)里面的exe 文件拷贝到新建的文件夹下。

在控制台中,用进入命令进入到新建文件夹所在的路径

 qt上位机,qt,开发语言,c++

最后用windeployqt把库加到新建的文件夹下

qt上位机,qt,开发语言,c++

然后 将exe程序发送到桌面上就可以使用了。

本人的学习还十分浅薄,有不对的地方欢迎大家批评指正,谨以此文来记录一下我的Qt学习之路吧。文章来源地址https://www.toymoban.com/news/detail-616680.html

到了这里,关于QT三驾马车(一)——实现上位机(串口数据发送和接收)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT实现TCP数据发送和接收】

    单客户端服务器实现代码: 在.pro文件添加 在头文件中添加 在源文件中添加

    2024年02月11日
    浏览(50)
  • 让三驾马车奔腾:华为如何推动空间智能化发展?

    上个月,国务院常务会议审议通过了《关于促进家居消费的若干措施》,其中明确提出了“推动单品智能向全屋智能发展创新培育智能消费”“开展数字家庭建设试点”等推动全屋智能拼配发展的建议与方案。 可以说,以整屋为单位的空间智能品类,正式迎来了发展最强音。

    2024年02月13日
    浏览(42)
  • STM32使用三种方式(阻塞、中断、DMA)实现串口发送和接收数据

    记录下学习STM32开发板的心得的和遇见的问题。 板卡型号:STM32F405RGT6 软件:STM32CubeMX、IAR STM32串口外设提供了3种接收和发送方式:阻塞、中断、DMA,主要给大家分享中断方式接收不定长数据和DMA使用空闲中断接收不定长数据。 阻塞发送: 阻塞接收: 两个函数需要注意的就

    2024年02月03日
    浏览(46)
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。比如STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等,这些都是芯片内部的电路,它们的配置寄存器、数据寄存器都在芯片里面,操作简单,直接读写就行。但是有些功能STM32内部没有

    2024年02月04日
    浏览(60)
  • 串口通信-发送和接收数据

    目录 通信方式 硬件电路 软件部分 USART外设(同步/异步收发器) 波特率 引脚复用 初始化基本流程 发送 接收 语言简述 常用的函数 使用的结构体 引脚模式 打印数据的三种方法 使用printf 在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,

    2024年02月12日
    浏览(57)
  • AGI时代的奠基石:Agent+算力+大模型是构建AI未来的三驾马车吗?

     ★AI Agent;人工智能体,RPA;大语言模型;prompt;Copilot;AGI;ChatGPT;LLM;AIGC;CoT;Cortex;Genius;MetaGPT;大模型;人工智能;通用人工智能;数据并行;模型并行;流水线并行;混合精度训练;梯度累积;Nvidia;A100;H100;A800;H800;L40s;混合专家;910B;HGX H20;L20 PCIe;L2 PCIe

    2024年02月04日
    浏览(40)
  • 串口发送数据,只接收到00的原因之一

    1、环境: STM32F103RCT6 KEIL 5 2、现象: 不管我发送任何类型的数据,在串口助手上显示接收到的都是00, 我头很大,去网上找了别人的代码对比检查。 终于,细心的我发现,原来粗心的我少了一行代码。 3、解决方案1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 好了,加上这一行

    2024年02月12日
    浏览(86)
  • 最详细STM32,cubeMX串口发送,接收数据

    这篇文章将详细介绍 串口 发送数据,接受数据。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。 实验:串口发送数据点亮 led。 如果想了解串口的基础知识可以参考我之前的文章: STM32Cube串口USART发送

    2024年02月04日
    浏览(67)
  • C#与松下PLC串口通讯发送,接收数据

    记录与学习 第一次跟PLC打交道,C#与松下plc交互读写功能,很多东西都是自己在网上找的,整理了下做个记录  引入“Panasonic.dll”文件 下载地址 百度盘百度网盘 请输入提取码  提取码:8vnm  public Panasonic.PLC Sp_PLC;   Sp_PLC.WCS(\\\"R\\\", \\\"1\\\", true);//提示PLC软件初始化完成,可以正常工

    2023年04月12日
    浏览(50)
  • C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据

    我们在开发串口程序的过程中有时候会遇到多个串口,并且多个串口也需要在多个线程进行操作,本文就来讲解如何实现多个串口在多线程下的安全发送与接收。 我们首先使用虚拟串口助手虚拟COM1、COM2这一对串口;COM3、COM4这一对串口,然后使用代码操作COM1,然后打开一个

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包