Qt知识点梳理 —— 串口通信实现

19 篇文章 2 订阅

简介

Qt中使用 QSerialPort 和 QSerialPortInfo 来实现串口通信相关功能;

界面设计

代码实现

首先需要在项目.pro文件中添加串口配置:

QT += serialport

使用 QSerialPortInfo 查询电脑中所有可用串口

//查找所有可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
	ui->tb_PName->addItem(info.portName());//添加到界面可选
}

设置串口参数:

m_curPort->setPortName(ui->tb_PName->currentText());//串口名
m_curPort->setBaudRate(ui->tb_PRate->currentText().toInt());//波特率
m_curPort->setDataBits((QSerialPort::DataBits)ui->tb_PBit->currentText().toInt());//数据位
switch(ui->tb_PParity->currentIndex())//奇偶校验
{
	case 0: m_curPort->setParity(QSerialPort::NoParity); break;
	case 1: m_curPort->setParity(QSerialPort::EvenParity); break;
	case 2: m_curPort->setParity(QSerialPort::OddParity); break;
	default: break;
}
switch(ui->tb_PStop->currentIndex())//停止位
{
	case 0: m_curPort->setStopBits(QSerialPort::OneStop); break;
	case 1: m_curPort->setStopBits(QSerialPort::OneAndHalfStop); break;
	case 2: m_curPort->setStopBits(QSerialPort::TwoStop); break;
	default: break;
}
m_curPort->setFlowControl(QSerialPort::NoFlowControl);//流控制

读取串口接收到的数据:

//从接收缓冲区中读取数据
QByteArray buffer = m_curPort->readAll();
//从界面中读取以前收到的数据
QString recv = QDateTime::currentDateTime().toString("HH:mm:ss.mmm")+": ";
recv+=QString(buffer);
//显示信息
ui->tb_Receive->append(recv);

向串口中写入数据:

//获取界面上的数据并转换成utf8格式的字节流
QByteArray data = ui->tb_Send->toPlainText().toUtf8();
m_curPort->write(data);

运行效果

项目源码

Github:lizhifun / QtSerialDemo

开发环境

Author:Lizhifun

OS:Windows 10 家庭中文版

Compiler:Microsoft Visual C++ Compiler 15.9.28307.1259(amd64)

Kit:Desktop Qt 5.14.2 MSVC2017 64bit

Qt Creator:4.11.1

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lizhifun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值