admin管理员组

文章数量:1558929

目的 用Qt编一个常见的串口助手

功能 向单片机发送一个数字,单片机向上位机返回相同的数字

UI 界面

程序代码

实现上面UI界面中所包括的功能,大部分就是槽函数的编写

widget.cpp 文件的代码如下

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

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

   Serial = new QSerialPort(this);

   connect(Serial,SIGNAL(readyRead()),this,SLOT(serialRead()));
   find_port();

}

Widget::~Widget()
{
    delete ui;
}


/*  打开串口提示,参数初始化配置 */
void Widget::on_open_clicked()
{
    Serial->setPortName(ui->ComID->currentText()); //设置串口名
    //我只提供了一种,若多种 switch case 进行选择
    //初始化
    Serial->setBaudRate(QSerialPort::Baud9600);//波特率 与单片机函数对应
    Serial->setDataBits(QSerialPort::Data8);//根据MCU来选择,一般是8 这个关系到串口是否成功打开
    Serial->setStopBits(QSerialPort::OneStop);
    Serial->setParity(QSerialPort::NoParity);

    bool flag = Serial->open(QIODevice::ReadWrite);
    if(flag){
        QMessageBox::information(this,"提示","成功");

    }else{
        QMessageBox::critical(this,"提示","失败");
    }

    ui->send->setEnabled(true);
    ui->close->setEnabled(true);


}



//查找串口
void Widget::find_port()
{
    //查找可用的串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);   //设置串口
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->ComID->addItem(serial.portName());        //显示串口name
            serial.close();
        }
    }
}

void Widget::on_close_clicked()
{
    Serial->clear(); //清空缓存区
    Serial->close(); //关闭串口

    ui->send->setEnabled(false); //关闭后,发送键不能再使用
    ui->open->setEnabled(true);  //关闭后可以再次打开
    ui->close->setEnabled(false);
}

/*读取数据*/
void Widget::serialRead()
{
    QString buf;
    buf = QString(Serial->readAll());
    ui->Receive->appendPlainText(buf);
}

/*发送数据*/
void Widget::on_send_clicked()
{
    Serial->write(ui->sendLine->text().toLocal8Bit().data());

}

/*清除屏幕上的数据*/
void Widget::on_clear_clicked()
{
    ui->Receive->clear();
}

void Widget::on_HTread_clicked()
{
    int id = 101;
    QByteArray arr;
    arr.append(QString::number(id));
    Serial->write(arr);
}

对应的头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include <Qstring>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_open_clicked();
    void find_port();
    void on_close_clicked();
    void serialRead();


    void on_send_clicked();

    void on_clear_clicked();

    void on_HTread_clicked();

private:
    Ui::Widget *ui;
    QSerialPort *Serial;

};
#endif // WIDGET_H

实际效果

 对应的单片机程序

注意引脚连接,上位机的输入与输出  和 下位机的输入与输出 反着接

#include "stm32f10x.h"                  // Device header
#include "LED.h"

#define TX GPIO_Pin_9   //发送 to
#define RX GPIO_Pin_10	//接受
u16 count;
u8 r;


void Usart_Init(u32 BaudRate)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
	GPIO_InitStructure.GPIO_Pin = TX;//发送 配置
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_InitStructure.GPIO_Pin = RX;//接受配置
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_DeInit(USART1);
	
	USART_InitStructure.USART_BaudRate = BaudRate; //波特率 配置 传参
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //关闭硬件流
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Parity = USART_Parity_No; //不使用奇偶校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位
	
	USART_Init(USART1,&USART_InitStructure);
	
	//清除标志位
	USART_ClearFlag(USART1,USART_FLAG_TXE|USART_FLAG_TC);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1,ENABLE); //串口使能
	
	//中断配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X01;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X00;
	
	NVIC_Init(&NVIC_InitStructure);	
	//LED1_ON();
	
}

void USART1_IRQHandler(void)
{
	//ITStatus IT;
	//LED1_ON();
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
	{
		r =USART_ReceiveData(USART1);
		USART_SendData(USART1,r);
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		
	}
	//LED1_ON();
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET)
	{
	
	}
	LED1_ON();
	count++;

}
#ifndef __USART_H
#define __USART_H

void Usart_Init(u32 BaudRate);
	


#endif
#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "LED.h"
#include "OLED.h"
#include "Usart.h"





int main(void)
{
	Usart_Init(9600);
	while(1)
	{
		
	}

}

Qt上位机显示单片机检测的温度

参考

QT host computer serial port real-time temperature and humidity display

本文标签: 串口助手QT