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 串口助手 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727405054a1113278.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论