QSerialPort
一、描述
此类继承自 QIODevice,提供访问串口的功能。
串口总是以独占方式打开(即没有其他进程或线程可以访问已经打开的串口)。
可以使用 read() 或 write() 方法读取端口数据,也可以调用 readLine() 和 readAll() 便捷方法。
如果不是一次读取所有数据,则剩余数据将在以后可用,因为新的传入数据将附加到的内部读取缓冲区。
QSerialPort 提供了一组函数,这些函数可以暂停调用线程,直到发出某些信号。这些函数可用于实现阻塞串口:
- waitForReadyRead():阻塞调用,直到有新数据可供读取。
- waitForBytesWritten():阻塞调用,直到有效负载数据已写入串行端口。
如果 waitForReadyRead() 返回 false,则连接已关闭或发生错误。
使用阻塞串口进行编程与使用非阻塞串口进行编程完全不同。阻塞的串行端口不需要事件循环,通常会导致更简单的代码。但是,在 GUI 应用程序中,阻塞串行端口只能在非 GUI 线程中使用,以避免冻结用户界面。
二、类型成员
1、enum QSerialPort::BaudRate:通信设备最常见的标准波特率。
- Baud1200
- Baud2400
- Baud4800
- Baud9600
- Baud19200
- Baud38400
- Baud57600
- Baud115200
2、enum QSerialPort::DataBits:使用的数据位数。
- Data5:每个字符的数据位数为5。它通常只适用于较旧的设备。
- Data6:每个字符的数据位数为6,很少使用。
- Data7:每个字符的数据位数为 7。它通常只适用于较旧的设备。
- Data8:每个字符中的数据位数为 8。它用于大多数类型的数据,因为这个大小与一个字节的大小相匹配。它几乎普遍用于较新的应用程序中。
3、enum QSerialPort::Direction:此枚举描述了数据传输的可能方向。用于在某些操作系统上为每个方向单独设置设备的波特率。
- Input:输入方向。
- Output:输出方向。
- AllDirections:同时在两个方向。
4、enum QSerialPort::FlowControl:此枚举描述了使用的流控制。
- NoFlowControl:无流量控制。
- HardwareControl:硬件流控制 (RTS/CTS)。
- SoftwareControl:软件流控制 (XON/XOFF)。
5、enum QSerialPort::Parity:此枚举描述了使用的奇偶校验方案。
- NoParity:没有发送奇偶校验位。这是最常见的奇偶校验设置。错误检测由通信协议处理。
- EvenParity:如果字符数据位中"1"的数目是偶数,校验位为"0",是奇数校验位为"1"。
- OddParity:如果字符数据位中"1"的数目是偶数,校验位为"1",是奇数校验位为"0"。
- SpaceParity:校验位始终为 0。
- MarkParity:校验位始终为 1。
例如:需要传输"11001110",数据中含5个"1",所以其奇校验位为"0",同时把"110011100"传输给接收方。
6、enum QSerialPort::PinoutSignal:此枚举描述了可能的 RS-232 引脚分配信号。
- NoSignal
- DataTerminalReadySignal:DTR(数据终端就绪)。
- DataCarrierDetectSignal:DCD(数据载波检测)。
- DataSetReadySignal:DSR(数据集就绪)。
- RingIndicatorSignal:RNG(环形指示器)。
- RequestToSendSignal:RTS(请求发送)。
- ClearToSendSignal:CTS(清除发送)。
- SecondaryTransmittedDataSignal:STD(次要传输数据)。
- SecondaryReceivedDataSignal:SRD(次要接收数据)。
7、enum QSerialPort::SerialPortError:此枚举描述了 error 属性可能包含的错误。
- NoError:没有发生错误。
- DeviceNotFoundError:尝试打开不存在的设备时发生错误。
- PermissionError:尝试打开已由另一个进程打开的设备或用户没有足够的权限和凭据打开时发生错误。
- OpenError:尝试打开此对象中已打开的设备时发生错误。
- NotOpenError:执行只有在设备打开的情况下才能成功执行的操作时会发生此错误。
- WriteError:写入数据时发生 I/O 错误。
- ReadError:读取数据时发生 I/O 错误。
- ResourceError:当资源不可用时发生 I/O 错误,例如当设备意外从系统中移除时。
- UnsupportedOperationError:正在运行的操作系统不支持或禁止请求的设备操作。
- TimeoutError:发生超时错误。
- UnknownError:发生不明错误。
8、enum QSerialPort::StopBits:此枚举描述了使用的停止位的数量。
- OneStop:1 个停止位。
- OneAndHalfStop:1.5 个停止位。仅适用于 Windows 平台。
- TwoStop:2 个停止位。
三、属性成员
1、baudRate : qint32
波特率。默认值为 Baud9600,即每秒 9600 位。
2、breakEnabled : bool
传输是否处于中断状态。此属性支持 QProperty 绑定。
在尝试设置或获取此属性之前,必须打开串口,否则返回 false 并设置 NotOpenError 错误代码。
3、dataBits : DataBits
帧中的数据位。此属性支持 QProperty 绑定。默认值为 Data8。
4、dataTerminalReady : bool
线路信号 DTR 的状态(高或低),设置为 true 表示 DTR 信号设置为高
在尝试设置或获取此属性之前,必须打开串口,否则返回 false 并将错误代码设置为 NotOpenError。
5、【只读】error : SerialPortError
串口的错误状态。此属性支持 QProperty 绑定。
调用 clearError() 后,错误代码设置为默认的 NoError。
6、flowControl : FlowControl
流控制模式。此属性支持 QProperty 绑定。默认值为 NoFlowControl。
7、parity : Parity
奇偶校验模式。此属性支持 QProperty 绑定。默认值为 NoParity。
8、requestToSend : bool
线路信号 RTS 的状态(高或低),设置为 true 表示 RTS 信号设置为高。
尝试在 HardwareControl 模式下控制 RTS 信号将失败,错误代码设置为 UnsupportedOperationError,因为该信号由驱动程序自动控制。
9、stopBits : StopBits
一帧中的停止位数。此属性支持 QProperty 绑定。默认值为 OneStop。
三、部分成员函数
1、bool clear(QSerialPort::Directions directions = AllDirections)
根据给定的方向,丢弃输出或输入缓冲区中的所有字符。这包括清除内部类缓冲区和 UART(驱动程序)缓冲区。同时终止挂起的读取或写入操作。返回是否成功。
2、bool flush()
将尽可能多的数据从内部写入缓冲区写入底层串行端口,而不会阻塞。如果写入了任何数据,此函数将返回true,否则返回false。
调用此函数将缓冲数据立即发送到串行端口。成功写入的字节数取决于操作系统。在大多数情况下,不需要调用此函数,因为一旦控件返回到事件循环,QSerialPort类将自动开始发送数据。如果没有事件循环,应改用 waitForBytesWritten()。
3、QSerialPort::PinoutSignals pinoutSignals()
返回线路信号的状态。此方法执行系统调用,从而确保正确返回线路信号状态。当底层操作系统无法提供有关更改的适当通知时此方法有用。
4、void setReadBufferSize(qint64 size)
设置内部读取缓冲区的大小,单位是字节。
如果缓冲区大小被限制在某个大小,QSerialPort 将不会缓冲超过这个大小的数据。
缓冲区大小为 0 的特殊情况意味着读取缓冲区是无限的,并且所有传入的数据都被缓冲。这是默认设置。
QSerialPortInfo
一、描述
此类提供有关现有串行端口的信息。
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();//系统上可用串行端口的列表
for(const auto & info : list)
{
if(!info.isNull())
{
qDebug()<<"串口名称:"<<info.portName();
qDebug()<<"串口系统位置:"<<info.systemLocation();
qDebug()<<"串口描述信息:"<<info.description();
qDebug()<<"串口制造商:"<<info.manufacturer();
qDebug()<<"串口序列号:"<<info.serialNumber();
if(info.hasProductIdentifier())
qDebug()<<"串口的产品编号:"<<info.productIdentifier();
if(info.hasVendorIdentifier())
qDebug()<<"串口的供应商编号:"<<info.vendorIdentifier();
qDebug()<<"--------------";
}
}
QList<qint32> list1 = QSerialPortInfo::standardBaudRates();
qDebug()<<"平台支持的可用标准波特率列表:"<<list1;