QT学习—串口LED小项目

前言——博主刚开始接触QT,本文参考博主嵌入式大杂烩的一篇博文易懂 | 手把手教你编写你的第一个上位机,初步学习一下QT开发。

一、QT安装

关于QT安装的一些细节这里就不再赘述了,已经有好多大佬介绍,我也是从那些介绍学习安装的QT。但是在下载时发现,下载速度极慢。参考了博主Loken2020的一个安装教程,说需要用命令行启动安装,切换成中科大的源,可以加快下载速度。但是本人在尝试时,发现博主给出的指令有点小问题(不排除是我自身原因)。这里再介绍一下。

我的qt-unified-windows-x86-4.2.0-online.exe文件放在E盘的QT文件夹下,win + R打开命令行窗口,输入下面的指令,可以切换成中科大的源进行下载

E:\QT\qt-unified-windows-x86-4.2.0-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject

实测速度快很超级多。博主使用的是手机热点下载,最快能到5M多。

QT安装

二、新建工程

由于博主是刚接触QT,关于新建工程这里也不过多的赘述,只是介绍和一下自己遇到的问题。新建完工程后发现自己的页面和教程不同。自己的页面没有分类文件夹。

没有文件夹分类

点击漏斗形状的图标,取消勾选“简化树形图”,就恢复正常了。

有文件夹分类

三、创建上位机界面

按照参考的博文,创建好了上位机界面

上位机界面

3.1 修改控件名

创建完上位机界面之后,需要修改我们用到的这些控件的名字。方便我们在后续编写程序时,能够快速的明白每一个控件的作用。

博主最开始修改控件名字的方式有问题,导致看似修改成功,但实际并没有修改成功。在后续编写槽函数时无法找到控件,程序编译报错。

博主最开始是在右侧修改的控件名称

修改控件名称

虽然修改完成后,在这个页面显示的名称也已经被修改。但是在后续编写完槽函数后,点击按钮,并不会执行对应的槽函数。此时选中控件,右键,选择“改变对象名称”发现,实际这里的控件名称并未被修改。

改变对象i你改成

但是在使用右键,选择“改变对象名称”的方法修改控件名称时,右侧的名称也会随之变化。因此,在修改控件名称时,用右键,选择“改变对象名称”的方法才是正规的。

3.2 添加槽函数

槽函数就是在按下某个按键或者有其他信号时,该信号对应的需要执行的内容。这里有四个按键,需要添加四个槽函数。添加的方法是,直接右键控件,选择“转到槽”。这样就可以直接编写槽函数,而且槽函数与信号自动关联,不需要我们再手动关联。

编写槽函数

打开串口按钮的槽函数如下

void MainWindow::on_openButton_clicked()
{
    // 串口设置
    serialPort->setPortName(ui->serialBox->currentText());   // 串口几
    serialPort->setBaudRate(ui->baudrateBox->currentText().toInt());   // 波特率
    serialPort->setDataBits(QSerialPort::Data8);   // 8位
    serialPort->setStopBits(QSerialPort::OneStop);   // 一位停止位
    serialPort->setParity(QSerialPort::NoParity);   // 无校验

    // 打开串口提示框
    if (true == serialPort->open(QIODevice::ReadWrite))
    {
        QMessageBox::information(this, "提示", "串口打开成功");
    }
    else
    {
        QMessageBox::critical(this, "提示", "串口打开失败");
    }
}

关闭串口和开关LED按钮的槽函数如下

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


void MainWindow::on_openButton_2_clicked()
{
    // 串口发送“ON”
    serialPort->write("ON\n");
}


void MainWindow::on_offButton_clicked()
{
    // 串口发送“OFF”
    serialPort->write("OFF\n");
}

值得注意的是,利用这种方法添加槽函数时,会有警告。

槽函数警告

这是因为我们使用上面的方法添加槽函数时,如果有一天我们修改了控件的名称。编译器不会报错,也可以继续运行。但是由于控件名称和槽函数无法对应,槽函数就失效了。其实这个警告并不影响我们这么操作,只是在后续修改控件名称时注意就好啦。

四、上位机程序打包

在打包上位机程序时,按照参考博主文章的介绍,并未遇到什么问题。但是上位机的图标要求的格式时.ico格式。这里推荐一个在线将图片转换成.ico格式的网站https://convertio.co/zh/png-ico/。最终,博主打包出来的上位机如下

打包出来的上位机

五、上位机测试

该上位机的主要功能是,通过串口控制LED的亮灭。关于串口通信的介绍,可以见博主STM32速成笔记系列串口通信篇。串口接收中断函数和解析函数如下

*==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}
/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		if (gReceFifo[1] == 'N')
		{
			Med_Led_StateCtrl (LED1,LED_ON);   // 点亮LED1
		}
		
		if (gReceFifo[1] == 'F' && gReceFifo[2] == 'F')
		{
			Med_Led_StateCtrl (LED1,LED_OFF);   // 熄灭LED1
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

六、总结

最后,简单总结一下这个小项目中的其他收获。

6.1 设置上位机窗口名称

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置窗口名称
    this->setWindowTitle("串口LED助手");
}

6.2 设置上位机图标

在.pro文件中添加

# 图标
RC_ICONS = led.ico

设置上位机图标

6.3 使用QMessageBox提示框

使用QMessageBox提示框,需要添加下面的头文件

#include <QMessageBox>   // 使用QMessageBox提示框

6.4 Debug输出

在利用Debug调试时,可以在调试窗口输出信息,程序如下

    // Debug输出
    qDebug("Ready!\n");
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,您需要将QT串口通信库添加到您的QT项目中。然后,您需要配置串口参数,例如波特率、数据位、停止位和校验位。接下来,您可以使用串口发送指令来控制单片机上的LED灯。 在单片机端,您需要编写一个程序来接收串口指令并控制LED灯。您可以使用单片机的UART串口模块来接收指令,并使用输出端口来控制LED灯的开关。 下面是一个简单的示例代码,可以在QT端发送指令来控制单片机上的LED灯: QT端代码: ```c++ QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.open(QIODevice::ReadWrite); // 发送控制指令 char cmd[] = {0x01}; // 控制LED灯亮 serial.write(cmd, sizeof(cmd)); ``` 单片机端代码: ```c #include <reg52.h> sbit LED = P0^0; // LED灯连接的输出端口 void main() { unsigned char cmd; TMOD = 0x20; // 定时器1工作在模式2,8位自动重载 TH1 = 0xFD; // 波特率9600,定时器1初值 SCON = 0x50; // 串口工作在模式1,8位数据,无校验位,1位停止位 TR1 = 1; // 启动定时器1 TI = 1; // 发送允许位置1 while(1) { if(RI) // 接收到一个字符 { cmd = SBUF; // 读取接收到的字符 RI = 0; // 清除接收中断标志 if(cmd == 0x01) // 控制LED灯亮 { LED = 1; } else if(cmd == 0x02) // 控制LED灯灭 { LED = 0; } } } } ``` 上述代码仅作为示例,实际项目中需要根据具体情况进行修改和完善。同时,需要注意串口通信的稳定性和可靠性,避免数据丢失或错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二土电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值