QT学习笔记——串口通信
程序员文章站
2024-02-22 10:30:49
...
写一个最简单的串口助手。
QT5以后,编写串口不需要借助第三方库了,可以说方便了不少。
先建立QT项目,在.pro文件里加入下面这行代码,不然会没有串口库额昂你使用的
QT += serialport
然后在头文件mainwindows.h中加入头文件
#include <QSerialPort>
#include <QSerialPortInfo>
其中QSerialPort是用来操作串口的,QSerialPortInfo提供串口信息
接着创建一个串口实例
QSerialPort *serial;
由于是做一个最简单的串口助手,所以界面很简洁,把波特率之类的都预设,只留了一个串口选择,连接,清理和发送。
串口选择这里可以直接去设备管理器里面查看串口号,然后选择预设的COM号进行连接,是如下操作
serial = new QSerialPort;
serial->setPortName(ui->comboBox->currentText());
也可以通过QSerialPort提供的功能,自动识别可利用的串口,并加入到comboBox。具体实现如下
void MainWindow::GetPort()
{
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->comboBox->addItem(serial.portName());
serial.close();
}
}
}
然后设置串口的一系列参数,为了方便直接赋值
serial->setBaudRate(QSerialPort::Baud9600); //设置波特率
serial->setDataBits(QSerialPort::Data8); //设置数据位
serial->setParity(QSerialPort::NoParity); //设置校验位
serial->setStopBits(QSerialPort::OneStop); //设置停止位
serial->setFlowControl(QSerialPort::NoFlowControl); //设置流控制
然后就是数据的接收和发送了
从上位机发送到下位机很直接
serial->write(ui->textEdit->toPlainText().toLatin1());
上位机接收下位机的数据分两步走
先写好数据处理函数,让接收到的数据在显示框接在已有的数据显示
void MainWindow::ReadData()
{
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty())
{
QString str = ui->textBrowser->toPlainText();
str += tr(buf);
ui->textBrowser->clear();
ui->textBrowser->append(str);
}
buf.clear();
}
然后将信号与槽函数连接,当串口接收到数据就调用数据处理的函数
connect(serial, &QSerialPort::readyRead, this, &MainWindow::ReadData);
然后,一个最简单的串口助手就写完了。
用虚拟串口做测试
贴出mainwindows.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
GetPort();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::ReadData()
{
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty())
{
QString str = ui->textBrowser->toPlainText();
str += tr(buf);
ui->textBrowser->clear();
ui->textBrowser->append(str);
}
buf.clear();
}
void MainWindow::GetPort()
{
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->comboBox->addItem(serial.portName());
serial.close();
}
}
}
void MainWindow::on_pushButton_Send_clicked()
{
serial->write(ui->textEdit->toPlainText().toLatin1());
}
void MainWindow::on_pushButton_Clear_clicked()
{
ui->textBrowser->clear();
ui->textEdit->clear();
}
void MainWindow::on_pushButton_clicked()
{
if(ui->pushButton->text() == tr("连接"))
{
serial = new QSerialPort;
serial->setPortName(ui->comboBox->currentText());
serial->open(QIODevice::ReadWrite);
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
ui->pushButton->setText(tr("断开"));
connect(serial, &QSerialPort::readyRead, this, &MainWindow::ReadData);
}
else
{
serial->clear();
serial->close();
serial->deleteLater();
ui->pushButton->setText(tr("连接"));
}
}