QT上位机串口控制MCU

news/2024/7/24 3:36:37 标签: qt, 单片机, 开发语言

🙌秋名山码民的主页
😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
获取源码,添加WX

目录

  • 前言
  • 1. 上位机
    • 1.1 上位机基础界面
    • 1.2 上位机逻辑代码编写
  • 最后


前言

本次给大家带来的是一个QT上位机的编写,最终页面如下:
在这里插入图片描述
开发工具:

  1. QT5
  2. Keil5
  3. mcu:野火指南者开发版,stm32F103

功能:上位机通过串口来控制开发板上的一个LED的亮灭

1. 上位机

1.1 上位机基础界面

在这里插入图片描述
实现效果:
在这里插入图片描述

1.2 上位机逻辑代码编写

  1. pro文件里面添加串口库
    在这里插入图片描述
  2. widget.h文件包含串口头文件
#include <QSerialPort>
#include <QSerialPortInfo>
  • QSerialPort 类提供了操作串口的各种接口。
  • QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。
  1. 添加QSerialPort成员

在这里插入图片描述

  1. 构造函数直接搜索所有可用串口
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    QStringList serialNamePort;

    ui->setupUi(this);
    this->setWindowTitle("serial_led");

    // 创建一个串口对象
    serialPort = new QSerialPort(this);

    // 搜索可用串口 
    foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {
        serialNamePort<<inf0.portName();
    }
    ui->U_comboBox->addItems(serialNamePort);
}

在这里插入图片描述

  1. 编写槽函数

这块可以直接从ui跳转到槽来节省时间,默认读者已会,直接给出槽函数代码:

void Widget::on_open_usart_Button_clicked()
{
    // 串口设置 
    serialPort->setPortName(ui->U_comboBox->currentText());
    serialPort->setBaudRate(ui->B_comboBox->currentText().toInt());
    serialPort->setDataBits(QSerialPort::Data8);
    serialPort->setStopBits(QSerialPort::OneStop);
    serialPort->setParity(QSerialPort::NoParity);

    //提示
    if(true == serialPort->open(QIODevice::ReadWrite))
    {
        QMessageBox::information(this,"Message","OpenSucceed");
    }
    else
    {
        QMessageBox::critical(this,"Message","OpenFailed");
    }
}


void Widget::on_open_led_pushButton_clicked()
{
    serialPort->write("1\n");
    qDebug("ON\n");
}


void Widget::on_close_led_pushButton_clicked()
{
    serialPort->write("8\n");
    qDebug("OFF\n");
}


void Widget::on_close_usart_pushButton_clicked()
{
    //关闭串口
    serialPort->close();
}

设置串口参数代码解释:

  1. setPortName(ui->U_comboBox->currentText()):设置串口的名称,通过ui->U_comboBox获取下拉框当前选中的文本。
  2. setBaudRate(ui->B_comboBox->currentText().toInt()):设置串口的波特率,通过ui->B_comboBox获取下拉框当前选中的文本,并将其转换为整数类型。
  3. setDataBits(QSerialPort::Data8):设置串口的数据位,这里设置为8位。
  4. setStopBits(QSerialPort::OneStop):设置串口的停止位,这里设置为1位。
  5. setParity(QSerialPort::NoParity):设置串口的校验位,这里设置为无校验位。

MCU代码来自野火:

#include "stm32f10x.h"
#include "./led/bsp_led.h" 
#include "./usart/bsp_usart.h" 

static void Show_Message(void);
  
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	
  char ch;
  
  /* 初始化RGB彩灯 */
  LED_GPIO_Config();
  
  /* 初始化USART 配置模式为 115200 8-N-1 */
  USART_Config();
	
  /* 打印指令输入提示信息 */
  Show_Message();
  while(1)
	{	
    /* 获取字符指令 */
    ch=getchar();
    printf("接收到字符:%c\n",ch);
    
    /* 根据字符指令控制RGB彩灯颜色 */
    switch(ch)
    {
      case '1':
        LED_RED;
      break;
      case '2':
        LED_GREEN;
      break;
      case '3':
        LED_BLUE;
      break;
      case '4':
        LED_YELLOW;
      break;
      case '5':
        LED_PURPLE;
      break;
      case '6':
        LED_CYAN;
      break;
      case '7':
        LED_WHITE;
      break;
      case '8':
        LED_RGBOFF;
      break;
      default:
        /* 如果不是指定指令字符,打印提示信息 */
        Show_Message();
        break;      
    }   
	}	
}


/**
  * @brief  打印指令输入提示信息
  * @param  无
  * @retval 无
  */
static void Show_Message(void)
{
  printf("\r\n   这是一个通过串口通信指令控制RGB彩灯实验 \n");
  printf("使用  USART  参数为:%d 8-N-1 \n",DEBUG_USART_BAUDRATE);
  printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");
  printf("   指令   ------ 彩灯颜色 \n");
  printf("     1    ------    红 \n");
  printf("     2    ------    绿 \n");
  printf("     3    ------    蓝 \n");
  printf("     4    ------    黄 \n");
  printf("     5    ------    紫 \n");
  printf("     6    ------    青 \n");
  printf("     7    ------    白 \n");
  printf("     8    ------    灭 \n");  
}

/*********************************************END OF FILE**********************/

最后

如果本文对你有所帮助,还请三连支持一下博主!
请添加图片描述


http://www.niftyadmin.cn/n/5188944.html

相关文章

【java学习—十五】经典例题:生产者/消费者问题(7)

文章目录 1. 题目2. 答案 1. 题目 生产者 (Productor) 将产品交给店员 (Clerk) &#xff0c;而消费者 (Customer)从店员处取走产品&#xff0c;店员一次只能持有固定数量的产品 ( 比如 4 &#xff09;&#xff0c;如果生产者试图生产更多的产品&#xff0c;店员会叫生产者停一下…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

JavaScript如何将 a=xiaoming 转换为对象类型

相信大家对于前端的JavaScript 一个字符串转换为对象有很多的疑惑或者是不会的地方吧&#xff0c;今天给大家带来一种最简单的方法实现呀 const queryString "a小明";// 创建一个新的URLSearchParams对象并传入查询参数字符串 const params new URLSearchParams(q…

VBA快速合并更新数据

实例需求&#xff1a;Sheet1中的数据每日更新&#xff0c;Sheet2的数据为数据总表&#xff0c;现需要每天将Sheet1的数据更新至Sheet2中&#xff0c;如果NameColor组合在Sheet2中已经存在&#xff0c;那么更新该行的Sales列数据&#xff0c;如果不是全新的数据&#xff0c;那么…

素质教育正式提出30周年 提高实际应用能力成为教育新选择

至2023年“素质教育”已正式提出30周年。在实施期间,素质教育取得了显著成就:不仅提高了学生的综合素质和竞争力,培养了学生的创新能力、实践能力等,同时也改变了应试导向和知识灌输的教育模式,建立了以人为本、以学为主的教育理念。 教育观念发生扭转,教育目标也随之改变。学…

Unexpected WSL error错误处理备忘

运行docker时提示下图错误&#xff0c;看了下WSL好像没啥问题&#xff0c;看网上有人说需要重置下网络&#xff0c;命令是netsh winsock reset&#xff0c;重置完后果然好了

knex事务

1.数据库事务 在执行SQL语句时&#xff0c;某些业务要求&#xff0c;一系列操作必须全部执行&#xff0c;而不能仅执行一部分。例如&#xff0c;一个转账操作&#xff1a; 从id1的账户给id2的账户转账100元 -- 第一步&#xff1a;将id1的A账户余额减去100 UPDATE accounts S…