QSerialPort 类方法解析
QSerialPort类提供的是是一个接入串口的功能,它从QT的5.1版本之后才开始有,它继承自QIODevice。还有一个串口辅助的类QSerialPortInfo,它可以列举出系统里所有的串口,通过这个类,配合setPort和setPortName方法,我们就可以安排一下自己想用的串口了。
下面是这类需要的头文件和工程文件的添加的qmake语句:
Header:#include <QSerialPort>
qmake:QT += serialport
文章目录
- QSerialPort 类方法解析
- 方法列举:
- 1.QSerialPort::setPortName
- 2.QSerialPort::setPort
- 3.QSerialPort::portName
- 4.QSerialPort::setBaudRate
- 5.QSerialPort::baudRate
- 6.QSerialPort::setDataBits
- 7.QSerialPort::dataBits
- 8.QSerialPort::setParity
- 9.QSerialPort::parity
- 10.QSerialPort::setStopBits
- 11.QSerialPort::stopBits
- 12.QSerialPort::setFlowControl
- 13.QSerialPort::flowControl
- 14.QSerialPort::open
- 15.QSerialPort::close
- 16.QSerialPort::setDataTerminalReady
- 17.QSerialPort::isDataTerminalReady
- 18.QSerialPort::setRequestToSend
- 19.QSerialPort::isRequestToSend
- 20.QSerialPort::pinoutSignals
- 21.QSerialPort::flush
- 22.QSerialPort::clear
- 23.QSerialPort::atEnd
- 24.QSerialPort::error
- 25.QSerialPort::readBufferSize 和 QSerialPort::setReadBufferSize
- 26.QSerialPort::bytesAvailable
- 27.QSerialPort::bytesToWrite
- 28.QSerialPort::canReadLine
- 29.QSerialPort::waitForReadyRead
- 30.QSerialPort::waitForBytesWritten
- 31.QSerialPort::sendBreak
- 32.QSerialPort::setBreakEnabled
- 33.QSerialPort::isBreakEnabled
- 34.setSettingsRestoredOnClose
方法列举:
1.QSerialPort::setPortName
设置串口波特率
QSerialPort::setPortName
是 Qt 框架中的一个函数,用于设置串口对象的串口名称。串口名称是用来标识计算机上可用串口的唯一标识符,以字符串的形式表示,比如"COM1"(在Windows上)或"/dev/ttyS0"(在Linux上)等。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
2.QSerialPort::setPort
设置存储串口信息
3.QSerialPort::portName
返回串口名
QSerialPort::portName
是 Qt Serial Port 模块中的一个属性,用于获取当前串口对象所连接的串口的名称。这个属性是只读的,可以用来查询已打开串口的名称。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
// 获取已打开串口的名称
QString portName = serialPort.portName();
qDebug() << "已打开的串口名称:" << portName;
} else {
qDebug() << "无法打开串口";
}
4.QSerialPort::setBaudRate
设置波特率
QSerialPort::setBaudRate
是 Qt Serial Port 模块中的一个函数,用于设置串口的波特率。波特率是串口通信中一个重要的参数,它指定了数据传输的速率,以每秒传输的比特数(波特)来表示。波特率必须在通信的两端保持一致,以确保正确的数据传输。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 设置波特率为9600
serialPort.setBaudRate(QSerialPort::Baud9600);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,波特率设置为" << serialPort.baudRate();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
5.QSerialPort::baudRate
获取波特率
QSerialPort::baudRate
是 Qt Serial Port 模块中的一个函数,用于获取当前串口的波特率设置。波特率是串口通信中一个重要的参数,它指定了数据传输的速率,以每秒传输的比特数(波特)来表示。波特率必须在通信的两端保持一致,以确保正确的数据传输。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,当前波特率为" << serialPort.baudRate();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
6.QSerialPort::setDataBits
QSerialPort::setDataBits
是 Qt Serial Port 模块中的一个函数,用于设置串口的数据位。数据位是串口通信中的一个重要参数,它定义了每个字符包含的数据位数。数据位可以设置为5位、6位、7位或8位,表示每个字符传输的二进制数据位数。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 设置数据位为8位
serialPort.setDataBits(QSerialPort::Data8);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,数据位设置为" << serialPort.dataBits();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
7.QSerialPort::dataBits
获取数据位设置
QSerialPort::dataBits
是 Qt Serial Port 模块中的一个函数,用于获取当前串口的数据位设置。数据位是串口通信中的一个重要参数,它定义了每个字符包含的数据位数。数据位可以设置为5位、6位、7位或8位,表示每个字符传输的二进制数据位数。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
QSerialPort::DataBits dataBits = serialPort.dataBits();
qDebug() << "串口已成功打开,当前数据位设置为" << dataBits;
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
8.QSerialPort::setParity
设置校验位
QSerialPort::setParity
是 Qt Serial Port 模块中的一个函数,用于设置串口的校验位(parity bit)。校验位是串口通信中的一个重要参数,它用于检测和纠正数据传输中的错误。串口通信可以选择以下几种校验位设置:
- NoParity(无校验):不使用校验位,数据直接传输。这是最简单的设置,但没有纠错能力。
- EvenParity(偶校验):校验位被设置为确保数据位中有偶数个1。如果数据位中有奇数个1,校验位会被设置为1,以使总共的位数为偶数。
- OddParity(奇校验):校验位被设置为确保数据位中有奇数个1。如果数据位中有偶数个1,校验位会被设置为1,以使总共的位数为奇数。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 设置校验位为奇校验
serialPort.setParity(QSerialPort::OddParity);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,校验位设置为" << serialPort.parity();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
9.QSerialPort::parity
获取校验位
QSerialPort::parity
是 Qt Serial Port 模块中的一个函数,用于获取当前串口的校验位(parity bit)设置。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
QSerialPort::Parity parity = serialPort.parity();
qDebug() << "串口已成功打开,当前校验位设置为" << parity;
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
10.QSerialPort::setStopBits
设置停止位
QSerialPort::setStopBits
是 Qt Serial Port 模块中的一个函数,用于设置串口通信中的停止位(stop bits)参数。停止位是串口通信中的一个重要参数,它指定了每个数据字节之后的停止位数目。串口通信可以选择以下几种停止位设置:
- OneStop(1 停止位):每个数据字节之后都有一个停止位。这是最常见的设置,也是串口通信的默认设置。
- OneAndHalfStop(1.5 停止位):每个数据字节之后有一个半停止位。这个设置较为不常见,用于特殊应用。
- TwoStop(2 停止位):每个数据字节之后有两个停止位。这个设置也比较不常见,但在某些特定情况下可能会使用。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 设置停止位为1停止位
serialPort.setStopBits(QSerialPort::OneStop);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,当前停止位设置为" << serialPort.stopBits();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
11.QSerialPort::stopBits
返回停止位
QSerialPort::stopBits
是 Qt Serial Port 模块中的一个函数,用于获取当前串口的停止位(stop bits)设置。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
QSerialPort::StopBits stopBits = serialPort.stopBits();
qDebug() << "串口已成功打开,当前停止位设置为" << stopBits;
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
12.QSerialPort::setFlowControl
设置流控制
QSerialPort::setFlowControl
是 Qt Serial Port 模块中的一个函数,用于设置串口通信中的流控制(Flow Control)模式。流控制是一种用于管理串口通信速率的机制,以确保数据正确传输的重要工具。
在串口通信中,有几种流控制模式可供选择,包括以下常见选项:
- NoFlowControl(无流控制):不使用流控制,数据的传输速度由发送方和接收方之间的协商来确定。这是最简单的流控制模式,适用于短距离通信或通信双方能够以相同速率进行通信的情况。
- HardwareControl(硬件流控制):使用硬件信号线(例如,RTS/CTS)来进行流控制。发送方将通过 RTS(Request to Send)信号通知接收方可以发送数据,而接收方通过 CTS(Clear to Send)信号来确认自己准备好接收数据。这种流控制模式适用于长距离通信或通信速率不匹配的情况。
- SoftwareControl(软件流控制):使用特殊的控制字符(XON和XOFF)来进行流控制。发送方在发送数据之前发送XON字符,表示可以继续发送,而接收方在准备好接收数据时发送XON字符,表示可以继续发送数据。这种流控制模式用于较慢的通信链路或通信速率不匹配的情况。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 设置流控制模式为硬件流控制
serialPort.setFlowControl(QSerialPort::HardwareControl);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开,当前流控制模式为" << serialPort.flowControl();
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
13.QSerialPort::flowControl
获取流控制
QSerialPort::flowControl
是 Qt Serial Port 模块中的一个成员函数,用于获取当前串口对象的流控制(Flow Control)模式。这个函数返回一个枚举类型的值,表示当前串口的流控制模式。
流控制模式用于管理串口通信中数据的流动,以确保数据传输的可靠性。Qt Serial Port 模块支持以下几种流控制模式,它们对应着枚举类型 QSerialPort::FlowControl
中的不同值:
QSerialPort::NoFlowControl
:这表示没有启用流控制。在这种模式下,数据的传输速度由发送方和接收方之间的协商来确定,用于简单的串口通信场景。QSerialPort::HardwareControl
:这表示启用硬件流控制。硬件流控制通过控制硬件信号线(如 RTS/CTS)来实现。发送方通过 RTS(Request to Send)信号通知接收方可以发送数据,而接收方通过 CTS(Clear to Send)信号来确认自己准备好接收数据。这种流控制模式适用于长距离通信或通信速率不匹配的情况。QSerialPort::SoftwareControl
:这表示启用软件流控制。软件流控制使用特殊的控制字符(XON和XOFF)来进行流控制。发送方在发送数据之前发送XON字符,表示可以继续发送,而接收方在准备好接收数据时发送XON字符,表示可以继续发送数据。这种流控制模式用于较慢的通信链路或通信速率不匹配的情况。QSerialPort::UnknownFlowControl
:这表示无法确定当前的流控制模式。这种情况发生在无法读取串口的状态或发生错误时。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 获取当前串口的流控制模式
QSerialPort::FlowControl currentFlowControl = serialPort.flowControl();
qDebug() << "串口当前流控制模式:" << currentFlowControl;
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
14.QSerialPort::open
打开串口,成功返回 true,失败返回 false
bool QSerialPort::open(OpenMode mode)
{
Q_D(QSerialPort);
if (isOpen()) {
d->setError(QSerialPortErrorInfo(QSerialPort::OpenError));
return false;
}
// Define while not supported modes.
static const OpenMode unsupportedModes = Append | Truncate | Text | Unbuffered;
if ((mode & unsupportedModes) || mode == NotOpen) {
d->setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, tr("Unsupported open mode")));
return false;
}
clearError();
if (!d->open(mode))
return false;
QIODevice::open(mode);
return true;
}
QSerialPort::open
是 Qt Serial Port 模块中的一个函数,用于打开串口以便进行串口通信。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开";
// 进行串口通信的相关操作
} else {
qDebug() << "无法打开串口";
}
15.QSerialPort::close
关闭串口,成功返回 true,失败返回false
void QSerialPort::close()
{
Q_D(QSerialPort);
if (!isOpen()) {
d->setError(QSerialPortErrorInfo(QSerialPort::NotOpenError));
return;
}
d->close();
d->isBreakEnabled = false;
QIODevice::close();
}
QSerialPort::close
是 Qt Serial Port 模块中的一个函数,用于关闭已打开的串口连接。这个函数的主要作用是终止与串口的通信并释放与串口相关的资源。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开";
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
16.QSerialPort::setDataTerminalReady
设置 DTR 状态
QSerialPort::setDataTerminalReady
是 Qt Serial Port 模块中的一个成员函数,用于设置数据终端就绪(Data Terminal Ready,DTR)信号的状态。DTR 是串口通信中的一种硬件流控制信号,用于通知外部设备串口已准备好进行通信或传输数据。
该函数接受一个布尔值参数,用于控制 DTR 信号的状态。具体来说:
- 如果参数为
true
,则表示要将 DTR 信号设置为处于就绪状态,用于通知外部设备可以开始通信。 - 如果参数为
false
,则表示要将 DTR 信号设置为非就绪状态,用于通知外部设备停止通信。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 将DTR信号设置为就绪状态
serialPort.setDataTerminalReady(true);
// 在此处可以执行串口通信操作
// 将DTR信号设置为非就绪状态
serialPort.setDataTerminalReady(false);
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
17.QSerialPort::isDataTerminalReady
检查 DTR 的状态
QSerialPort::isDataTerminalReady
是 Qt Serial Port 模块中的一个成员函数,用于检查数据终端就绪(Data Terminal Ready,DTR)信号的当前状态。
该函数返回一个布尔值,指示 DTR 信号的状态:
- 如果函数返回
true
,表示 DTR 信号处于就绪状态,即串口已准备好进行通信。 - 如果函数返回
false
,表示 DTR 信号处于非就绪状态,即串口未准备好通信。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 检查DTR信号的状态
bool isDTRReady = serialPort.isDataTerminalReady();
if (isDTRReady) {
qDebug() << "DTR信号处于就绪状态";
} else {
qDebug() << "DTR信号处于非就绪状态";
}
// 在此处可以执行串口通信操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
18.QSerialPort::setRequestToSend
设置 RTS 状态
QSerialPort::setRequestToSend
是 Qt Serial Port 模块中的一个成员函数,用于设置请求发送(Request to Send,RTS)信号的状态。RTS 信号是串口通信中的一种硬件流控制信号,用于通知外部设备串口是否准备好接收数据。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 设置RTS信号为激活状态
serialPort.setRequestToSend(true);
qDebug() << "RTS信号已激活";
// 在此处可以执行向外部设备发送数据的操作
// 设置RTS信号为非激活状态
serialPort.setRequestToSend(false);
qDebug() << "RTS信号已非激活";
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
19.QSerialPort::isRequestToSend
检查 RTS 状态
在 Qt Serial Port 模块中,QSerialPort::isRequestToSend
是一个成员函数,用于查询请求发送(Request to Send,RTS)信号的当前状态。
该函数不需要参数,它返回一个布尔值,表示 RTS 信号的状态:
- 如果返回
true
,表示 RTS 信号当前处于激活状态,即请求发送数据。 - 如果返回
false
,表示 RTS 信号当前处于非激活状态,即不请求发送数据。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 查询RTS信号的状态
bool rtsStatus = serialPort.isRequestToSend();
if (rtsStatus) {
qDebug() << "RTS信号处于激活状态";
} else {
qDebug() << "RTS信号处于非激活状态";
}
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
20.QSerialPort::pinoutSignals
获取串口引脚状态
在 Qt Serial Port 模块中,QSerialPort::pinoutSignals
是一个成员函数,用于获取当前串口的引脚状态信息,包括各种硬件控制信号的状态。这些硬件控制信号包括数据终端就绪(Data Terminal Ready,DTR)、请求发送(Request to Send,RTS)、数据载波检测(Data Carrier Detect,DCD)、数据准备就绪(Data Set Ready,DSR)、奇偶校验错误(Parity Error,PE)等。
pinoutSignals
函数返回一个枚举值,表示当前串口的各个控制信号的状态组合。这个枚举值是一个位掩码,其中每个位代表一个不同的控制信号。可以使用位操作来提取或检查特定的信号状态。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 获取当前控制信号状态
QSerialPort::SerialPortPinoutSignals signals = serialPort.pinoutSignals();
// 检查DTR信号状态
bool dtrStatus = signals & QSerialPort::DataTerminalReadySignal;
if (dtrStatus) {
qDebug() << "DTR信号处于激活状态";
} else {
qDebug() << "DTR信号处于非激活状态";
}
// 检查RTS信号状态
bool rtsStatus = signals & QSerialPort::RequestToSendSignal;
if (rtsStatus) {
qDebug() << "RTS信号处于激活状态";
} else {
qDebug() << "RTS信号处于非激活状态";
}
// 检查DCD信号状态
bool dcdStatus = signals & QSerialPort::DataCarrierDetectSignal;
if (dcdStatus) {
qDebug() << "DCD信号处于激活状态";
} else {
qDebug() << "DCD信号处于非激活状态";
}
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
21.QSerialPort::flush
刷新串口的输入缓冲区和输出缓冲区
QSerialPort::flush
是 Qt Serial Port 模块中的一个成员函数,用于刷新串口的输入缓冲区和输出缓冲区。刷新操作可以清除未处理的数据,确保串口的输入和输出缓冲区都为空。
这个函数有两个可选参数,用于指定要刷新的缓冲区类型:
QSerialPort::Input
:表示刷新输入缓冲区,清除所有未读取的数据。QSerialPort::Output
:表示刷新输出缓冲区,确保所有待发送的数据都被发送出去。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 向串口写入数据
serialPort.write("Hello, Serial Port!");
// 刷新输出缓冲区,确保数据被发送
serialPort.flush(QSerialPort::Output);
// 刷新输入缓冲区,清除未读取的数据
serialPort.flush(QSerialPort::Input);
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
22.QSerialPort::clear
清除串口的输入缓冲区和输出缓冲区中的数据
在 Qt Serial Port 模块中,QSerialPort::clear
是一个成员函数,用于清除串口的输入缓冲区和输出缓冲区中的数据。与 flush
不同,clear
不会尝试将数据发送出去,而只是清除数据。
这个函数没有参数,当调用它时,它会立即清除串口的输入和输出缓冲区中的数据。这可以用于确保在重新开始串口通信时不会处理之前的数据。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 向串口写入数据
serialPort.write("Hello, Serial Port!");
// 清除输入缓冲区和输出缓冲区中的数据
serialPort.clear();
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
23.QSerialPort::atEnd
查串口是否已经读取到了输入流的末尾
QSerialPort::atEnd
是 Qt Serial Port 模块中的一个成员函数,用于检查串口是否已经读取到了输入流的末尾。这个函数主要用于串口通信时的输入操作,例如从串口读取数据。
函数的返回值是一个布尔值,表示串口输入流是否已经到达了末尾。如果返回 true
,则表示已经读取到了输入流的末尾,不再有可用的数据。如果返回 false
,则表示输入流还有数据可供读取。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadOnly)) {
// 读取串口数据,直到到达输入流的末尾
while (!serialPort.atEnd()) {
QByteArray data = serialPort.read(100); // 读取最多100字节的数据
qDebug() << "Received data:" << data;
}
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭";
} else {
qDebug() << "无法打开串口";
}
24.QSerialPort::error
获取串口的错误状态
QSerialPort::error
是 Qt Serial Port 模块中的一个成员函数,用于获取当前串口对象的错误状态。这个函数不接受参数,并返回一个枚举值,表示串口的错误状态。
返回的枚举值是 QSerialPort::SerialPortError
枚举类型的成员,用于表示不同的错误状态。这些错误状态包括但不限于以下几种:
QSerialPort::NoError
:表示没有错误,串口正常工作。QSerialPort::DeviceNotFoundError
:表示找不到指定的串口设备。QSerialPort::PermissionError
:表示没有足够的权限打开串口。QSerialPort::OpenError
:表示无法打开串口。QSerialPort::ParityError
:表示奇偶校验错误。QSerialPort::FramingError
:表示帧错误。QSerialPort::BreakConditionError
:表示发生了中断条件错误。QSerialPort::WriteError
:表示写入数据时发生错误。QSerialPort::ReadError
:表示读取数据时发生错误。
可以使用 QSerialPort::error
函数来检查串口是否在操作过程中出现了错误,然后根据需要采取适当的措施来处理这些错误,例如记录错误消息、关闭串口连接或重新尝试操作等。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 进行串口通信操作
// 检查是否有错误发生
if (serialPort.error() == QSerialPort::NoError) {
qDebug() << "串口操作成功";
} else {
qDebug() << "串口发生错误:" << serialPort.errorString();
}
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
25.QSerialPort::readBufferSize 和 QSerialPort::setReadBufferSize
获取和设置串口接收缓冲区的大小
QSerialPort::readBufferSize
和 QSerialPort::setReadBufferSize
是 QSerialPort
类中的一个属性,用于获取和设置串口接收缓冲区的大小。串口接收缓冲区用于存储从串口设备读取的数据,应用程序可以从缓冲区中读取数据。
- 获取属性值:要获取当前串口的接收缓冲区大小,可以使用
QSerialPort
对象的readBufferSize()
函数。这将返回一个整数,表示接收缓冲区的大小(以字节为单位)。 - 设置属性值:要设置接收缓冲区的大小,可以使用
QSerialPort
对象的setReadBufferSize(int size)
函数,其中size
参数是希望设置的新的接收缓冲区大小。
接收缓冲区的大小是一个重要的设置,它会影响到从串口读取数据的方式。如果预计将大量数据从串口读取,可以增加接收缓冲区的大小,以确保不会丢失任何数据。注意,过大的接收缓冲区可能会导致内存消耗过多,根据应用程序的需求来选择合适的大小。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 获取当前接收缓冲区大小
int bufferSize = serialPort.readBufferSize();
qDebug() << "当前接收缓冲区大小:" << bufferSize << "字节";
// 设置新的接收缓冲区大小为1024字节
serialPort.setReadBufferSize(1024);
// 继续串口通信操作
} else {
qDebug() << "无法打开串口";
}
26.QSerialPort::bytesAvailable
获取当前串口接收缓冲区中可用的字节数
QSerialPort::bytesAvailable
是 QSerialPort
类中的一个成员函数,用于获取当前串口接收缓冲区中可用的字节数。
该函数返回一个 qint64
类型的整数,表示在当前时刻串口接收缓冲区中可用的字节数。可以使用这个值来确定是否有足够的数据可供读取,以及要读取的数据量。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 循环读取串口数据
while (serialPort.bytesAvailable() > 0) {
QByteArray data = serialPort.readAll(); // 读取所有可用的数据
qDebug() << "读取的数据:" << data;
}
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
27.QSerialPort::bytesToWrite
获取当前待写入到串口的字节数
QSerialPort::bytesToWrite
是 QSerialPort
类中的一个成员函数,用于获取当前待写入到串口的字节数。
该函数返回一个 qint64
类型的整数,表示当前等待写入到串口的字节数。可以使用这个值来确定尚未写入的数据量。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
QByteArray dataToSend = "Hello, Serial!"; // 要写入的数据
qint64 bytesWritten = serialPort.write(dataToSend); // 写入数据到串口
// 检查是否所有数据都已写入
if (bytesWritten == dataToSend.size()) {
qDebug() << "数据已成功写入串口";
} else {
qDebug() << "写入数据时出现错误";
}
// 获取待写入的字节数
qint64 remainingBytes = serialPort.bytesToWrite();
qDebug() << "待写入的字节数:" << remainingBytes;
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
28.QSerialPort::canReadLine
检查串口接收缓冲区中是否有一行可用的数据
QSerialPort::canReadLine
是 QSerialPort
类中的一个函数,用于检查串口接收缓冲区中是否有一行可用的数据(以换行符 \n
或回车符 \r
结尾)。
这个函数返回一个布尔值,如果串口接收缓冲区中存在一行可用的数据,则返回 true
,否则返回 false
。
在串口通信中,数据以不同的方式进行分隔,例如使用换行符、回车符或其他特定的字符。canReadLine
函数允许检查是否已经接收到一行完整的数据。如果返回 true
,可以使用 readLine
函数来读取这一行数据。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 检查是否有一行可用的数据
if (serialPort.canReadLine()) {
// 读取一行数据
QByteArray lineData = serialPort.readLine();
QString lineString = QString::fromUtf8(lineData); // 将字节数组转换为字符串
qDebug() << "已读取的行数据:" << lineString;
} else {
qDebug() << "没有可用的行数据";
}
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
29.QSerialPort::waitForReadyRead
阻塞当前线程,直到串口接收缓冲区中有数据可供读取。
QSerialPort::waitForReadyRead
是 QSerialPort
类中的一个函数,用于阻塞当前线程,直到串口接收缓冲区中有数据可供读取。
该函数有两个不同的版本,具体取决于传递的参数:
bool QSerialPort::waitForReadyRead(int msecs)
:这个版本的函数会阻塞当前线程,直到串口接收缓冲区中有数据可供读取,或者超过了指定的时间(以毫秒为单位)。如果在指定的时间内有数据可供读取,函数将返回true
,否则返回false
。bool QSerialPort::waitForReadyRead(int msecs, QIODevice::OpenMode mode)
:这个版本的函数除了等待数据可读取外,还允许指定操作模式(例如读取、写入等)。可以传递一个QIODevice::OpenMode
枚举值来指定操作模式。这个函数会阻塞当前线程,直到指定操作模式的操作可以继续,并且在指定的时间内有数据可供读取,或者超过了指定的时间。如果条件满足,函数返回true
,否则返回false
。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 设置超时时间为1000毫秒(1秒)
int timeout = 1000;
// 等待串口接收缓冲区中有数据可供读取
if (serialPort.waitForReadyRead(timeout)) {
// 读取数据
QByteArray data = serialPort.readAll();
qDebug() << "已读取的数据:" << data;
} else {
qDebug() << "超时:没有可用的数据";
}
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
30.QSerialPort::waitForBytesWritten
阻塞当前线程,直到所有待写入的数据都已经成功写入到串口
QSerialPort::waitForReadyRead
是 QSerialPort
类中的一个函数,用于阻塞当前线程,直到串口接收缓冲区中有数据可供读取。
该函数有两个不同的版本,具体取决于传递的参数:
bool QSerialPort::waitForReadyRead(int msecs)
:这个版本的函数会阻塞当前线程,直到串口接收缓冲区中有数据可供读取,或者超过了指定的时间(以毫秒为单位)。如果在指定的时间内有数据可供读取,函数将返回true
,否则返回false
。bool QSerialPort::waitForReadyRead(int msecs, QIODevice::OpenMode mode)
:这个版本的函数除了等待数据可读取外,还允许指定操作模式(例如读取、写入等)。可以传递一个QIODevice::OpenMode
枚举值来指定操作模式。这个函数会阻塞当前线程,直到指定操作模式的操作可以继续,并且在指定的时间内有数据可供读取,或者超过了指定的时间。如果条件满足,函数返回true
,否则返回false
。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 设置超时时间为1000毫秒(1秒)
int timeout = 1000;
// 等待串口接收缓冲区中有数据可供读取
if (serialPort.waitForReadyRead(timeout)) {
// 读取数据
QByteArray data = serialPort.readAll();
qDebug() << "已读取的数据:" << data;
} else {
qDebug() << "超时:没有可用的数据";
}
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
31.QSerialPort::sendBreak
发送一个串口中断信号
QSerialPort::sendBreak
是 Qt 框架中的一个函数,用于发送一个串口中断信号(break signal)。这个信号用于串口通信中的特殊情况,例如在通信协议中需要发送一个特定的中断信号来指示某种操作或条件。
函数签名:
void QSerialPort::sendBreak(int duration = 0);
参数:
duration
(可选参数):指定中断信号的持续时间,以毫秒为单位。默认值为0,表示发送一个持续时间为0的中断信号,即一个短暂的中断信号。
功能:
QSerialPort::sendBreak
函数用于发送一个串口中断信号。中断信号的作用和效果取决于串口设备和通信协议,因此它的具体用途可能因情况而异。中断信号用于通知接收方执行某种特定的操作,或者表示某种特殊条件。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 发送一个500毫秒的中断信号
serialPort.sendBreak(500);
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
32.QSerialPort::setBreakEnabled
设置是否启用串口的中断(break)功能
QSerialPort::setBreakEnabled
是 Qt 框架中的一个函数,用于设置是否启用串口的中断(break)功能。中断(break)是一种特殊的信号,用于串口通信中的特殊情况,用于通知接收方执行某种特定操作或表示特殊条件。
函数签名:
void QSerialPort::setBreakEnabled(bool set = false);
参数:
set
:一个布尔值,指定是否启用中断功能。默认值为 false
,表示不启用中断功能。如果设置为 true
,则启用中断功能。
功能:
QSerialPort::setBreakEnabled
函数用于在串口通信中启用或禁用中断功能。启用中断功能后,可以通过调用 QSerialPort::sendBreak
函数来发送中断信号。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 启用中断功能
serialPort.setBreakEnabled(true);
// 在此处可以执行其他串口通信操作,包括发送中断信号
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
33.QSerialPort::isBreakEnabled
查询当前串口是否启用了中断(break)功能
QSerialPort::isBreakEnabled
是 Qt 框架中的一个函数,用于查询当前串口是否启用了中断(break)功能。中断是一种特殊的信号,用于串口通信中的特殊情况,用于通知接收方执行某种特定操作或表示特殊条件。
函数签名:
bool QSerialPort::isBreakEnabled() const;
功能:
QSerialPort::isBreakEnabled
函数用于查询当前串口是否启用了中断功能。如果返回值为 true
,表示中断功能已启用;如果返回值为 false
,则表示中断功能未启用。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
// 打开串口连接
if (serialPort.open(QIODevice::ReadWrite)) {
// 检查是否启用了中断功能
bool isBreakEnabled = serialPort.isBreakEnabled();
if (isBreakEnabled) {
qDebug() << "串口启用了中断功能";
} else {
qDebug() << "串口未启用中断功能";
}
// 在此处可以执行其他串口通信操作
// 关闭串口连接
serialPort.close();
} else {
qDebug() << "无法打开串口";
}
34.setSettingsRestoredOnClose
串口关闭时是否恢复串口的设置
QSerialPort::setSettingsRestoredOnClose
是 Qt 框架中的一个函数,用于配置串口对象的行为。具体来说,这个函数用于设置在串口关闭时是否恢复串口的设置。
在使用串口通信时,需要配置一些参数,比如波特率、数据位、停止位、奇偶校验等等。这些设置是通过调用 QSerialPort
类的函数来完成的。一旦配置了这些参数,串口就可以用于通信了。
QSerialPort::setSettingsRestoredOnClose
函数的作用是控制在串口关闭时是否自动恢复之前配置的串口设置。默认情况下,它是启用的,这意味着当关闭串口后,下次打开串口时会自动恢复之前配置的设置。这对于某些应用场景很有用,因为它可以避免每次打开串口时都需要重新配置串口。
但在某些情况下,可能希望关闭串口时不自动恢复设置,而是保持当前的设置。可以通过调用 setSettingsRestoredOnClose(false)
来禁用这个功能。这样,关闭串口时,串口的设置将保持不变,下次打开串口时仍然使用之前的设置。
基本用法:
QSerialPort serialPort;
serialPort.setPortName("COM1"); // 设置串口名称为COM1
serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率为9600
// 配置属性,将设置还原设置为true
serialPort.setSettingsRestoredOnClose(true);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "串口已成功打开";
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭,设置已还原";
} else {
qDebug() << "无法打开串口";
}
else {
qDebug() << “串口未启用中断功能”;
}
// 在此处可以执行其他串口通信操作
// 关闭串口连接
serialPort.close();
} else {
qDebug() << “无法打开串口”;
}
##### 14.setSettingsRestoredOnClose
> 串口关闭时是否恢复串口的设置
`QSerialPort::setSettingsRestoredOnClose` 是 Qt 框架中的一个函数,用于配置串口对象的行为。具体来说,这个函数用于设置在串口关闭时是否恢复串口的设置。
在使用串口通信时,需要配置一些参数,比如波特率、数据位、停止位、奇偶校验等等。这些设置是通过调用 `QSerialPort` 类的函数来完成的。一旦配置了这些参数,串口就可以用于通信了。
`QSerialPort::setSettingsRestoredOnClose` 函数的作用是控制在串口关闭时是否自动恢复之前配置的串口设置。默认情况下,它是启用的,这意味着当关闭串口后,下次打开串口时会自动恢复之前配置的设置。这对于某些应用场景很有用,因为它可以避免每次打开串口时都需要重新配置串口。
但在某些情况下,可能希望关闭串口时不自动恢复设置,而是保持当前的设置。可以通过调用 `setSettingsRestoredOnClose(false)` 来禁用这个功能。这样,关闭串口时,串口的设置将保持不变,下次打开串口时仍然使用之前的设置。
基本用法:
QSerialPort serialPort;
serialPort.setPortName(“COM1”); // 设置串口名称为COM1
serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率为9600
// 配置属性,将设置还原设置为true
serialPort.setSettingsRestoredOnClose(true);
// 尝试打开串口
if (serialPort.open(QIODevice::ReadWrite)) {
qDebug() << “串口已成功打开”;
// 进行串口通信的相关操作
// 关闭串口连接
serialPort.close();
qDebug() << "串口已关闭,设置已还原";
} else {
qDebug() << “无法打开串口”;
}