如果用夸脱写程序作为上位机,然后通过和通用串行总线和下位机通信的时候,就需要用到夸脱中的串口通信了。本文介绍了夸脱串口通信的实现方法,感兴趣的小伙伴们可以参考一下
前言:如果用夸脱写程序作为上位机,然后通过和通用串行总线和下位机通信的时候,就需要用到夸脱中的串口通信了。
使用夸脱中的串口通信的时候需要用到的两个头文件分别为:
#包含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串行通信的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。