QT串口编程 - QSerialPort类
- 提供对串口的访问
- 头文件:#include <QSerialPort>
- qmake: QT += serialport
- 最低版本: Qt5.1
- 继承自:QIODevice
公共类型(Public Types)
类型 | 名称 | 值 |
---|---|---|
enum | BaudRate | Baud1200, Baud2400, Baud4800, Baud9600, ..., UnknownBaud |
enum | DataBits | Data5, Data6, Data7, Data8, UnknownDataBits |
enum | Direction | Input, Output, AllDirections |
flags | Directions | |
enum | FlowControl | NoFlowControl, HardwareControl, SoftwareControl, UnknownFlowControl |
enum | Parity | NoParity, EvenParity, OddParity, SpaceParity, MarkParity, UnknownParity |
enum | PinoutSignal | NoSignal, TransmittedDataSignal, ReceivedDataSignal, DataTerminalReadySignal, ..., SecondaryReceivedDataSignal |
flags | PinoutSignals | |
enum | SerialPortError | NoError, DeviceNotFoundError, PermissionError, OpenError, ..., UnknownError |
enum | StopBits | OneStop, OneAndHalfStop, TwoStop, UnknownStopBits |
属性(Properties)
名称 | 类型 |
---|---|
baudRate | qint32 |
breakEnabled | bool |
dataBits | DataBits |
dataTerminalReady | bool |
error | SerialPortError |
flowControl | FlowControl |
parity | Parity |
requestToSend | bool |
stopBits | StopBits |
说明
QSerialPort类提供访问串行端口的功能。
您可以使用QSerialPortInfo
帮助程序类获取有关可用串行端口的信息,该类允许枚举系统中的所有串行端口。这对于获取要使用的串行端口的正确名称很有用。您可以将帮助程序类的对象作为参数传递给setPort()
或setPortName()
方法,以分配所需的串行设备。
设置端口后,可以使用open()
方法以只读(r / o),只写(w / o)或读写(r / w)模式打开它。
注意:串行端口始终以独占访问方式打开(也就是说,没有其他进程或线程可以访问已打开的串行端口)。
使用close()
方法关闭端口并取消I / O操作。
成功打开后,QSerialPort
会尝试确定端口的当前配置并进行初始化。您可以使用setBaudRate()
,setDataBits()
,setParity()
,setStopBits()
和setFlowControl()
方法将端口重新配置为所需的设置。
有两个属性可与管脚信号一起使用,即:QSerialPort :: dataTerminalReady
,QSerialPort :: requestToSend
。也可以使用pinoutSignals()
方法查询当前的引脚分配信号集。
一旦知道端口已准备好读取或写入,就可以使用read()
或write()
方法。另外,还可以调用readLine()
和readAll()
便捷方法。如果不是一次读取所有数据,则在将新的传入数据附加到QSerialPort的内部读取缓冲区后,其余数据将可供以后使用。您可以使用setReadBufferSize()
限制读取缓冲区的大小。
QSerialPort提供了一组函数,这些函数可以挂起调用线程,直到发出某些信号为止。这些功能可用于实现阻塞串行端口:
-
waitForReadyRead()
阻止调用,直到可以读取新数据为止。 -
waitForBytesWritten()
阻止调用,直到将一个有效载荷数据写入串行端口为止。
示例如下:
int numRead = 0, numReadTotal = 0;
char buffer[50];
for (;;) {
numRead = serial.read(buffer, 50);
// Do whatever with the array
numReadTotal += numRead;
if (numRead == 0 && !serial.waitForReadyRead())
break;
}
如果waitForReadyRead()
返回false,则说明连接已关闭或发生了错误。
如果在任何时间点发生错误,QSerialPort将发出errorOccurred()
信号。 您还可以调用error()
来查找最后发生的错误的类型。
使用阻塞串行端口进行编程与使用非阻塞串行端口进行编程完全不同。 阻塞的串行端口不需要事件循环,通常可以简化代码。 但是,在GUI应用程序中,阻塞串行端口应仅在非GUI线程中使用,以避免冻结用户界面。
有关这些方法的更多详细信息,请参见示例应用程序。
QSerialPort类也可以与QTextStream和QDataStream的流运算符(operator <<()
和operator >>()
)一起使用。 但是,有一个问题需要注意:在尝试使用operator >>()
重载运算符进行读取之前,请确保有足够的数据可用。
另请参见QSerialPortInfo。
网友评论