由于本科毕设课题的需要,需要进行上位机软件开发的相关工作,于是学习了Qt的有关知识,Qt是一个跨平台开发框架,是基于C++语言写的一套类库,可以为桌面计算机、服务器、移动设备甚至单片机开发各种应用,具备出色的跨平台开发能力,支持Windows系统、Linux和macOS,同样支持移动操作系统包括Android、iOS,还支持嵌入式设备、MCU的应用开发。Qt的基本开发语言是C++,同时Qt对标准的C++语言进行了扩展,引入了信号与槽,属性等机制,为跨平台和GUI程序的对象间通信提供了极大的方便。
作为一个电机的上位机软件,首先需要能够对串口进行控制,控制串口的打开和关闭,同时需要借助串口与下位机进行通信,获取从下位机得到的电机运行数据,对电机运行位置,速度等信息进行可视化显示和运行数据保存,上述基本功能是本次课题上位机软件的基础,随着项目的推进,还需要对功能进行丰富完善,进一步丰富软件内容。
这是我第一次写博客,内容存在诸多不足之处,恳请各位朋友给予指导和批评。
串口设置——基础知识
在写这一部分内容时,我参考和引用了王维波老师等人编著的《Qt 6 C++开发指南》这本书中的有关内容。在人机交互的过程中,会经常使用串口与下位机进行通信,Qt Serial Port模块提供了访问串口的基本功能,可以对通信参数和数据读写进行设置,在本次课题中在串口部分的主要工作就是可以在上位机软件上控制串口的打开关闭,并且能够在串口打开时读取下位机传来的电机运行信息,并且可以向下位机发送指令信息,如果希望使用Qt Serial Port模块,需要在项目的配置文件添加:
QT += serialport
Qt Serial Port模块中有两个类:QSerialPortInfo和QSerialPort,如果希望使用这两个类需要引入下列头文件:
#include <QSerialPortInfo>
#include <QSerialPort>
1.QSerialPortInfo类有两个静态函数可以用于获取系统中可用的串口列表,以及系统支持的串口通信波特率列表,这两个函数的定义如下(可以使用F1查看文档或者上搜索引擎直接搜索也可查看):
QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
QList<qint32> QSerialPortInfo::standardBaudRates()
包含串口硬件信息的接口函数主要有:
QString portNme() //串口名称
QString description() //串口的文字描述
bool isNull() //串口是否为空,返回值为true时该串口无效
QString manufacturer() //制造商
quint16 productIdentifier() //产品ID
QString serialNumber() //序列号
2.QSerialPort类是访问某个具体串口的类,它可以设置串口通信的参数,打开串口后就可以读写串口数据。它的父类是QIODevice,所以它属于I/O设备类。其中包含的函数主要为以下三部分功能服务:
(1)设置串口通信参数
串口通信参数有波特率(每秒传输数据位数)、数据位个数、停止位个数、奇偶校验位,有以下函数用于设置这些参数:
bool setBaudRate(qint32 baudRate,QSerialPort::Directions directions = AllDirections) //设置波特率
bool setDataBits(QSerialPort::DataBits dataBits) //设置数据位个数
bool setStopBits(QSerialPort::StopBits stopBits) //设置停止位个数
bool setParity(QSerialPort::Parity parity) //设置奇偶校验模式
bool setFlowControl(QSerialPort::FlowControl flowControl) //设置流控制
- 函数setBaudRate()用于设置数据帧里一个字符的数据位个数,不包含奇偶校验位,计算机串口通信参数一般是8个数据位,可以设置为QSerialPort::Data8。
- 函数setParity()用于设置奇偶校验的位数,在串口通信中一般无奇偶校验位,可以设置为QSerialPort::NoParity
- 函数setStopBits()用于设置停止位个数,一般是一位停止位,设置为QSerialPort::OneStop
- setFlowControl(QSerialPort::NoFlowControl)表示无流控制
(2)打开和关闭串口
相关函数定义如下:
void setPort(const QSerialPortInfo &serialPortInfo) //设置串口
void setPortName(const QString &name) //设置串口名称
bool open(QIODeviceBase::OpenMode mode) //打开串口
void close() //关闭串口
调用函数open()打开串口之前要先调用setPort()或setPortName()设定要打开哪个串口。
函数open()打开一个串口,参数mode设置打开的模式,只能设置为QIODeviceBase::ReadOnly、QIODeviceBase::WriteOnly和QIODeviceBase::ReadWrite,不能设置为其他模式。串口总是以独占方式打开的,其他进程或线程无法访问一个已经被打开的串口。
串口使用结束后,可以调用close()函数关闭串口。
(3)数据读写,我主要用到readAll()和write()分别用于收发数据
总结:这一篇中简述了Qt中的串口模块使用方法与常用函数,不得不说Qt的串口模块为编写上位机软件提供了莫大的方便,关键就是掌握调用现成函数与设置参数的方法,在下一篇中写自己基于ui界面与代码相结合的方法实现控制串口打开,关闭的过程。