来源
B站大学
示例界面:
在这里插入图片描述
- 提示:创建完工程可以先编译一下,检查工程的创建是否有问题,防止后续编写完之后才发现有问题得不偿失。
- 注意:所建工程存放的目录中一定不能要有中文名!
- 解决:main.cpp中加入以下语句,解决运行窗口与ui界面窗口大小显示不匹配的问题。
if(QT_VERSION>=QT_VERSION_CHECK(5,6,0))
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
1. 设计ui界面
- 接收框
接收别的设备发来的数据。使用Plain Text Edit控件。
将接收框的属性改为只读模式。
- 信息框
添加左下侧信息框(串口号、波特率、数据位、停止位、校验位、流控) —> Combo Box + Label 控件
- 发送框
使用助手软件给别的设备发送数据。使用LineEdit控件。
- 功能按钮
打开、关闭、发送、清空串口按钮 --> Push Button
广告位 --> Group Box + Label
运行看效果:
- 调整布局
- 向combo box中添加选项
双击控件 -> ➕号
并设置默认值:
- 改控件名(自行)
- 添加电脑的端口号
在.pro文件中添加类
串口号combo box使用代码将其信息加上去(widget.cpp):
#include <QSerialPortInfo>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList serialPortName;
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
serialPortName << info.portName();
}
ui->serialName->addItems(serialPortName);
}
运行查看效果:此时端口号已经被添加到了combo box中
2. 实现逻辑功能
- 新建端口对象
widget.h:
// 引用头文件
#include <QSerialPort>
// 在public中声明对象
public:
QSerialPort serialPort;
widget.cpp
// new一个对象,主函数中
serialPort = new QSerialPort(this);
- 实现“打开串口”按钮功能
相关变量在QSerialPort类中已定义好,我们可以查看一下(帮助栏中):
打开串口的同时对串口进行初始化(左侧的信息栏)
void Widget::on_open_serial_clicked()
{
QSerialPort::BaudRate baudRate;
QSerialPort::DataBits dataBits;
QSerialPort::StopBits stopBits;
QSerialPort::Parity checkBits;
if(ui->baud_rate->currentText() == "4800"){
baudRate = QSerialPort::Baud4800;
}else if(ui->baud_rate->currentText() == "9600"){
baudRate = QSerialPort::Baud9600;
}else if(ui->baud_rate->currentText() == "115200"){
baudRate = QSerialPort::Baud115200;
}
if(ui->data_bits->currentText() == "5"){
dataBits = QSerialPort::Data5;
}else if(ui->data_bits->currentText() == "6"){
dataBits = QSerialPort::Data6;
}else if(ui->data_bits->currentText() == "7"){
dataBits = QSerialPort::Data7;
}else if(ui->data_bits->currentText() == "8"){
dataBits = QSerialPort::Data8;
}
if(ui->stop_bits->currentText() == "1"){
stopBits = QSerialPort::OneStop;
}else if(ui->stop_bits->currentText() == "1.5"){
stopBits = QSerialPort::OneAndHalfStop;
}else if(ui->stop_bits->currentText() == "2"){
stopBits = QSerialPort::TwoStop;
}
if(ui->check_bits->currentText() == "none"){
checkBits = QSerialPort::NoParity;
}
serialPort->setPortName(ui->serialName->currentText());
serialPort->setBaudRate(baudRate);
serialPort->setDataBits(dataBits);
serialPort->setStopBits(stopBits);
serialPort->setParity(checkBits);
if(serialPort->open(QIODevice::ReadWrite) == true){
QMessageBox::information(this, "提示", "打开成功");
}
else{
QMessageBox::critical(this, "提示", "失败");
}
}
效果展示:
- 实现“关闭串口”按钮功能
void Widget::on_close_serial_clicked()
{
serialPort->close();
}
- 实现接收框功能
查看信号说明,单从名字来看,readyRead()最符合我们需要。
widget.h
#include <QString>
private slots:
void serialPort_readRead_slot();
widget.cpp
// 关联串口和槽函数获取输入
connect(serialPort, SIGNAL(readyRead()), this, SLOT(serialPort_readRead_slot()));
void Widget::serialPort_readRead_slot(){
QString buf;
buf = QString(serialPort->readAll());
ui->data_receiveWin->appendPlainText(buf);
}
- 实现发送数据功能
void Widget::on_send_data_clicked()
{
// 转成char*类型
serialPort->write(ui->send_data->text().toLocal8Bit().data());
}
- 实现清空发送框功能
void Widget::on_clear_data_clicked()
{
ui->data_receiveWin->clear();
}
总体效果还要自己链接开发板进行调试。