QT串口通信的实现方法

QT串口通信的实现方法

如果用夸脱写程序作为上位机,然后通过和通用串行总线和下位机通信的时候,就需要用到夸脱中的串口通信了。本文介绍了夸脱串口通信的实现方法,感兴趣的小伙伴们可以参考一下

前言:如果用夸脱写程序作为上位机,然后通过和通用串行总线和下位机通信的时候,就需要用到夸脱中的串口通信了。

使用夸脱中的串口通信的时候需要用到的两个头文件分别为:

#包含QtSerialPort/QSerialPort

#包含QtSerialPort/QSerialPortInfo

除了加上面两个头文件之外,还需要在工程文件中加下面一行代码:

QT=串行端口

我们一般都需要先定义一个全局的串口对象,记得在自己的头文件中添加上:

QSerialPort *串行

到这里我们就可以调用夸脱串口通信中的函数了,一般来讲夸脱串口通信需要经过七步:

1、设置串口名(如COM1)

序列号=新QSerialPort

serial-set端口名(ui-port box-current text());

这里我使用自动寻找可用串口的方法,直接自动设置了

foreach (const QSerialPortInfo,QSerialPortInfo:available ports())

{

QSerialPort序列;

连载。setport(信息);

如果(连载。open(QIODevice:read write))

{

ui-port box-addItem(串行。端口名());

连载。close();

}

}

2、打开串口

serial-open(QIODevice:read write);

3、设置波特率(如115200)

serial-setBaudRate(QSerialPort:baud 115200);//设置波特率为115200

4、设置数据位(如8)

串行设置数据比特(QSerialPort:data 8);//设置数据位8

5、设置校验位(如0)

串行集奇偶校验(QSerialPort:无奇偶校验);//校验位设置为0

6、设置停止位(如1)

serial-setStopBits(QSerialPort:one stop);//停止位设置为一

7、设置流控制

串行设置流量控制(QSerialPort:无流量控制);//设置为无流控制

到这里串口通信的设置就完成了,下面我们需要实现对数据的发送和接收

1、连接数据接收槽函数,下位机中一有数据发送过来的时候就会响应这个槽函数

QObject:connect(serial,QSerialPort:readyRead,this,main window:read data);

2、从上位机发送数据到下位机

串行写入(ui-textEdit _ 2-toPlainText()。to Latin 1());

主要使用的函数就这些了,我们来看看代码:

1、工程文件SerialPortTool.pro

# -

#

#由QtCreator创建的项目2017-11-17T15:43:04

#

# -

QT=核心图形用户界面

QT=串行端口

greaterThan(QT_MAJOR_VERSION,4): QT=小部件

TARGET=SerialPortTool

模板=应用程序

#如果使用,下面的定义会使编译器发出警告

# Qt的任何被标记为不推荐使用的特性(确切的警告

#取决于您的编译器)。请参考的文档

#弃用API,以便了解如何将您的代码从应用程序接口中移植出来。

DEFINES=QT_DEPRECATED_WARNINGS

#如果使用不推荐使用的API,还可能导致代码无法编译。

#为此,请取消对以下行的注释。

#您也可以选择仅在夸脱的特定版本中禁用不推荐使用的API .

# DEFINES=QT _ DISABLE _ DEPRECATED _ BEFORE=0x 060000 #禁用Qt 6.0.0之前已弃用的所有应用程序接口

来源=

主页面

主窗口。卡片打印处理机(Card Print Processor的缩写)

标题=

主窗口。h

表单=

主窗口。用户界面

2、头文件主窗口。h

#ifndef MAINWINDOW_H

#定义主窗口_H

#包含QMainWindow

#包含QDebug

#包含QtSerialPort/QSerialPort

#包含QtSerialPort/QSerialPortInfo

命名空间Ui {

类主窗口

}

类主窗口:公共QMainWindow

{

q _对象

公共:

显式主窗口(q widget * parent=0);

~主窗口();

专用插槽:

void on _ open串行按钮_ clicked();

void read data();

void on _ send button _ clicked();

私人:

ui:主窗口* ui

QSerialPort *串行

};

#endif //MAINWINDOW_H

3、源文件主窗口。卡片打印处理机(Card Print Processor的缩写)

#包含"主窗口. h "

#include ui_mainwindow.h

主窗口:主窗口(q widget * parent):

QMainWindow(父级),

用户界面(新Ui:主窗口)

{

ui-setupUi(这个);

//查找可用的串口

foreach (const QSerialPortInfo,QSerialPortInfo:available ports())

{

QSerialPort序列;

连载。setport(信息);

如果(连载。open(QIODevice:read write))

{

ui-port box-addItem(串行。端口名());

连载。close();

}

}

//设置波特率下拉菜单默认显示第0项

ui-BaudBox-setCurrentIndex(0);

}

主窗口:~主窗口()

{

删除ui;

}

void主窗口:on _ open串行按钮_ clicked()

{

if(ui-打开串行按钮-text()==tr(打开串口))

{

序列号=新QSerialPort

//设置串口名

serial-set端口名(ui-port box-current text());

//打开串口

serial-open(QIODevice:read write);

//设置波特率

serial-setBaudRate(QSerialPort:baud 115200);//设置波特率为115200

//设置数据位数

开关(ui-BitBox-currentIndex())

{

案例8:

串行设置数据比特(QSerialPort:data 8);//设置数据位8

打破;

默认值:

打破;

}

//设置校验位

开关(ui-ParityBox-currentIndex())

{

案例0:

串行集奇偶校验(QSerialPort:无奇偶校验);

打破;

默认值:

打破;

}

//设置停止位

开关(ui-BitBox-currentIndex())

{

案例1:

serial-setStopBits(QSerialPort:one stop);//停止位设置为一

打破;

案例二:

serial-setStopBits(QSerialPort:two stop);

默认值:

打破;

}

//设置流控制

串行设置流量控制(QSerialPort:无流量控制);//设置为无流控制

//关闭设置菜单使能

ui-port box-set enabled(false);

ui-BaudBox-set enabled(false);

ui位框集启用(假);

ui-奇偶校验框-set enabled(false);

ui-stop box-set enabled(false);

ui-OpenSerialButton-setText(tr(关闭串口));

//连接信号槽

QObject:connect(serial,QSerialPort:readyRead,this,main window:read data);

}

其他

{

//关闭串口

串行-清除();

串行关闭();

serial-delete la ter();

//恢复设置使能

ui-port box-set enabled(真);

ui-BaudBox-set enabled(真);

ui-BitBox-setEnabled(真);

ui-奇偶校验框-set enabled(真);

ui-stop box-set enabled(真);

ui-OpenSerialButton-setText(tr(打开串口));

}

}

//读取接收到的信息

void MainWindow:ReadData()

{

QByteArray缓冲区

buf=串行-read all();

如果(!buf.isEmpty())

{

QString str=ui-textEdit-toPlainText();

str=tr(buf);

ui-textEdit-clear();

ui-textEdit-append(str);

}

buf。clear();

}

//发送按钮槽函数

void主窗口:on _ send button _ clicked()

{

串行写入(ui-textEdit _ 2-toPlainText()。to Latin 1());

}

4、界面文件主窗口。用户界面

?可扩展标记语言版本=1.0 编码=UTF八号?

用户界面版本=4.0

类主窗口/类

widget class= QMainWindow name= main window

属性名称=几何

矩形

x0/x

y0/y

宽度547/宽度

身高470/身高

/rect

/属性

属性名=windowTitle

stringMainWindow/string

/属性

widget class= q widget name= central widget

widget class= q label name= label

属性名称=几何

矩形

x10/x

50日元/年

宽度54/宽度

高度12/高度

/rect

/属性

属性名称=文本

线串口/字符串

/属性

/小部件

widget class= q label name= label _ 2

属性名称=几何

矩形

x10/x

90日元/年

宽度54/宽度

高度12/高度

/rect

/属性

属性名称=文本

线波特率/字符串

/属性

/小部件

widget class= q label name= label _ 3

属性名称=几何

矩形

x10/x

130日元/年

宽度54/宽度

高度12/高度

/rect

/属性

属性名称=文本

线数据位/字符串

/属性

/小部件

widget class= QComboBox name= port box

属性名称=几何

矩形

x100/x

50日元/年

宽度69/宽度

高度22/高度

/rect

/属性

/小部件

widget class= QComboBox name= BaudBox

属性名称=几何

矩形

x100/x

90日元/年

宽度69/宽度

高度22/高度

/rect

/属性

属性名=currentIndex

数字0/数字

/属性

项目

属性名称=文本

字符串9600/字符串

/属性

/项目

项目

属性名称=文本

字符串19200/字符串

/属性

/项目

项目

属性名称=文本

字符串38400/字符串

/属性

/项目

项目

属性名称=文本

字符串57600/字符串

/属性

/项目

项目

属性名称=文本

字符串115200/字符串

/属性

/项目

/小部件

widget class= QComboBox name= BitBox

属性名称=几何

矩形

x100/x

120日元/年

宽度69/宽度

高度22/高度

/rect

/属性

属性名=currentIndex

数字0/数字

/属性

项目

属性名称=文本

字符串8/字符串

/属性

/项目

/小部件

widget class= QComboBox name=奇偶校验框

属性名称=几何

矩形

x100/x

160日元/年

宽度69/宽度

高度22/高度

/rect

/属性

项目

属性名称=文本

字符串0/字符串

/属性

/项目

/小部件

widget class= q label name= label _ 4

属性名称=几何

矩形

x10/x

160日元/年

宽度61/宽度

身高16/身高

/rect

/属性

属性名称=文本

线校验位/string

/属性

/小部件

widget class= q label name= label _ 6

属性名称=几何

矩形

x10/x

200日元/年

宽度54/宽度

高度12/高度

/rect

/属性

属性名称=文本

线停止位/string

/属性

/小部件

widget class= QComboBox name= stop box

属性名称=几何

矩形

x100/x

200日元/年

宽度69/宽度

高度22/高度

/rect

/属性

项目

属性名称=文本

字符串1/字符串

/属性

/项目

/小部件

widget class= q按钮 name=打开串行按钮

属性名称=几何

矩形

x100/x

240日元/年

宽度71/宽度

高度23/身高

/rect

/属性

属性名称=文本

线打开串口/string

/属性

/小部件

widget class= QTextEdit name= textEdit

属性名称=几何

矩形

x200/x

y30/年

宽度221/宽度

身高291/身高

/rect

/属性

/小部件

widget class= QTextEdit name= textEdit _ 2

属性名称=几何

矩形

x200/x

y330/年

宽度221/宽度

高度31/身高

/rect

/属性

/小部件

widget class= q按钮 name=发送按钮

属性名称=几何

矩形

x430/x

y330/年

宽度75/宽度

高度31/身高

/rect

/属性

属性名称=文本

线发送/string

/属性

/小部件

/小部件

widget class= QMenuBar name= menuBar

属性名称=几何

矩形

x0/x

y0/y

宽度547/宽度

高度23/身高

/rect

/属性

/小部件

widget class= q toolbar name= main toolbar

属性名=toolBarArea

enumtopolbararea/enum

/属性

属性名=toolBarBreak

布尔型/布尔型

/属性

/小部件

widget class= QStatusBar name=状态栏/

/小部件

布局默认间距=6 边距=11/

资源/

连接/

/ui

效果图如下,自己设置对应下位机的波特率就可以实现数据收发了

这里注意,串行通信是按字节发送的,所以如果你定义了一个char buff[10],你想这样定义buff[0]=255 ,当你把字符255发送给下位机时,下位机会接收不完整。经过测试,发现发送大于等于10的字符会被截断,只剩下最后一个字符。比如发送10个字符时,下位机会接收不完整。例如,char buff[]=255 ,这样就可以发送完整255。但是需要注意的是,这是一个字符串,不是字符,所以如果你在下位机,你要根据上位机发来的数据来处理某件事情的时候,一定要知道你发的是字符还是字符串。

关于QT串口通信的实现,本文到此结束。有关QT串行通信的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

QT串口通信的实现方法