前言

本次给大家带来的是一个QT上位机的编写,最终页面如下:
QT上位机串口控制MCU-LMLPHP
开发工具:

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

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

1. 上位机

1.1 上位机基础界面

QT上位机串口控制MCU-LMLPHP
实现效果:
QT上位机串口控制MCU-LMLPHP

1.2 上位机逻辑代码编写

  1. pro文件里面添加串口库
    QT上位机串口控制MCU-LMLPHP
  2. widget.h文件包含串口头文件
#include <QSerialPort>
#include <QSerialPortInfo>
  • QSerialPort 类提供了操作串口的各种接口。
  • QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。
  1. 添加QSerialPort成员

QT上位机串口控制MCU-LMLPHP

  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);
}

QT上位机串口控制MCU-LMLPHP

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

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**********************/

最后

如果本文对你有所帮助,还请三连支持一下博主!
QT上位机串口控制MCU-LMLPHP

11-17 18:56