QT串口通讯
前言:如果使用qt作为上位机编写程序,然后通过usb与下位机通信,则需要使用qt中的串口通信。
在qt中使用串口通信时需要用到的两个头文件是:
#include
#include
除了添加上面两个头文件外,还需要在工程文件中添加如下一行代码:
QT += serialport
我们一般需要先定义一个全局串口对象,记得将其添加到你的头文件中:
QSerialPort *serial;
至此,我们就可以调用qt串口通信中的函数了。 一般来说,qt串口通信需要经过7个步骤:
1.设置串口名称(如COM1)
serial = new QSerialPort;
serial->setPortName(ui->PortBox->currentText());
这里我采用自动查找可用串口的方法,直接自动设置
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->PortBox->addItem(serial.portName());
serial.close();
}
}
2.打开串口
serial->open(QIODevice::ReadWrite);
3.设置波特率(例)
serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200
4.设置数据位(如8)
serial->setDataBits(QSerialPort::Data8);//设置数据位8
5、设置校验位(如0)
serial->setParity(QSerialPort::NoParity); //校验位设置为0
6.设置停止位(如1)
serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
7. 设置流量控制
serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
至此,串口通讯设置完成。 接下来我们需要实现数据的发送和接收。
【获取更多QT学习资料,点击下方链接免费获取↓↓,先码字直播不迷路~】
点击→Qt开发高级技术栈学习路线及资料
1、连接数据接收槽函数,下位机有数据发送时会响应该槽函数。
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
2、上位机向下位机发送数据
serial->write(ui->textEdit_2->toPlainText().toLatin1());
主要用到的函数就是这些,我们看一下代码:
1.项目文件.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-11-17T15:43:04
#
#-------------------------------------------------
QT += core gui
QT += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = SerialPortTool
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
2.头文件.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_OpenSerialButton_clicked();
void ReadData();
void on_SendButton_clicked();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
};
#endif // MAINWINDOW_H
3.源文件.cpp
【获取更多QT学习资料,点击下方链接免费获取↓↓,先码字直播不迷路~】
Qt开发高级技术栈学习路线及资料
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//查找可用的串口
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->PortBox->addItem(serial.portName());
serial.close();
}
}
//设置波特率下拉菜单默认显示第0项
ui->BaudBox->setCurrentIndex(0);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_OpenSerialButton_clicked()
{
if(ui->OpenSerialButton->text() == tr("打开串口"))
{
serial = new QSerialPort;
//设置串口名
serial->setPortName(ui->PortBox->currentText());
//打开串口
serial->open(QIODevice::ReadWrite);
//设置波特率
serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200
//设置数据位数
switch (ui->BitBox->currentIndex())
{
case 8:
serial->setDataBits(QSerialPort::Data8);//设置数据位8
break;
default:
break;
}
//设置校验位
switch (ui->ParityBox->currentIndex())
{
case 0:
serial->setParity(QSerialPort::NoParity);
break;
default:
break;
}
//设置停止位
switch (ui->BitBox->currentIndex())
{
case 1:
serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
break;
case 2:
serial->setStopBits(QSerialPort::TwoStop);
default:
break;
}
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
//关闭设置菜单使能
ui->PortBox->setEnabled(false);
ui->BaudBox->setEnabled(false);
ui->BitBox->setEnabled(false);
ui->ParityBox->setEnabled(false);
ui->StopBox->setEnabled(false);
ui->OpenSerialButton->setText(tr("关闭串口"));
//连接信号槽
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
}
else
{
//关闭串口
serial->clear();
serial->close();
serial->deleteLater();
//恢复设置使能
ui->PortBox->setEnabled(true);
ui->BaudBox->setEnabled(true);
ui->BitBox->setEnabled(true);
ui->ParityBox->setEnabled(true);
ui->StopBox->setEnabled(true);
ui->OpenSerialButton->setText(tr("打开串口"));
}
}
//读取接收到的信息
void MainWindow::ReadData()
{
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty())
{
QString str = ui->textEdit->toPlainText();
str+=tr(buf);
ui->textEdit->clear();
ui->textEdit->append(str);
}
buf.clear();
}
//发送按钮槽函数
void MainWindow::on_SendButton_clicked()
{
serial->write(ui->textEdit_2->toPlainText().toLatin1());
}
4.界面文件.ui
MainWindow
0
0
547
470
MainWindow
10
50
54
12
串口
10
90
54
12
波特率
10
130
54
12
数据位
100
50
69
22
100
90
69
22
0
-
9600
-
19200
-
38400
-
57600
-
115200
100
120
69
22
0
-
8
100
160
69
22
-
0
10
160
61
16
校验位
10
200
54
12
停止位
100
200
69
22
-
1
100
240
71
23
打开串口
200
30
221
291
200
330
221
31
430
330
75
31
发送
0
0
547
23
TopToolBarArea
false
效果图如下,可以自行设置对应下位机的波特率,实现数据发送和接收
这里注意,使用串口通信时,是按字节发送的,所以如果定义了一个char buff[10],而想定义buff[0] = '255'将字符255发送给下位机,下位机将接收不到完整的数据。 经过测试发现发送大于等于10的字符会被截断,只留下最后一个字符。 例如,发送10个字符时,下位机可能只接收字符0.为字符串形式。 比如char buff[] = "255",这样就可以发送完整的255,但是需要注意的是,这是一个字符串而不是字符,所以如果你想根据上位机发送的数据来处理一些东西,你必须知道你发送的是字符还是字符串。