上次没写完的,接着写完。接着写一下QserialPort的成员函数。
本文主要参考的是官方手册,力争写一个可信的,详尽可查的QserialPort类学习手册。
1、构造函数
QSerialPort的构造函数有三种形式,分别是:
*1、QSerialPort::QSerialPort(QObject * parent = Q_NULLPTR)
这是比较常用的一种,用给定的父对象构造一个新的串口对象。
*2、QSerialPort::QSerialPort(const QString & name, QObject * parent = Q_NULLPTR)
这种形式跟上一种形式相比,多了一个名字。就是用具体的名字代表串口,用指定的父对象构造一个新的串口对象。这个名字需要有一个具体的格式。参照QString QSerialPort::portName() const,我们可以知道:这个名字必须是简短的,比如,它可以从设备的内部系统变量处转化而来,具体的转换原则根据平台不同有所差异,可以参照下面的表格:
Platform | Brief Description |
Windows | Removes the prefix "\\.\" or "//./" from the system location and returns the remainder of the string. |
Windows CE | Removes the suffix ":" from the system location and returns the remainder of the string. |
Unix, BSD | Removes the prefix "/dev/" from the system location and returns the remainder of the string. |
*3、 QSerialPort::QSerialPort(const QSerialPortInfo & serialPortInfo, QObject * parent = Q_NULLPTR)
这种新式引入了QSerialPortInfo类。就是以具体的serialPortInfo类给定的信息为基准,用给定的父对象构造一个新的串口对象。
2、析构函数
析构函数是一个虚函数,可以继承下来重写。[virtual] QSerialPort::~QSerialPort(),关闭串口,如果需要的话,也可以吧对象一并注销。
3、虚函数成员函数
*1、[virtual] bool QSerialPort::atEnd() const
这个函数是QIODevice::atEnd()的继承和重载。如果没有数据可供读取了,函数返回true,否则返回false。
这个功能在循环读取串口数据的时候使用非常多。举个例子:
// This slot is connected to QSerialPort::readyRead()
void QSerialPortClass::readyReadSlot()
{
while (!port.atEnd()) {
QByteArray data = port.read(100);
....
}
}
*2、[virtual] qint64 QSerialPort::bytesAvailable() const
这个函数是QIODevice::bytesAvailable()的继承和重载。这个函数会返回串口收到的那些等待读取的数据字节数。
*3、[virtual] qint64 QSerialPort::bytesToWrite() const
这个函数是QIODevice::bytesToWrite()的继承和重载。这个函数会返回等待写入的数据字节数。当控件返回到事件循环或刷新(flush()被调用)时写入字节。
*4、[virtual] bool QSerialPort::canReadLine() const
这个函数是QIODevice::canReadLine()的继承和重载。如果可以从串口读取一行数据,函数返回true,否则返回false。
*5、[virtual] void QSerialPort::close()
这个函数是QIODevice::close()的继承和重载。注意:在关闭之前,确保串口已经处于打开状态,否则会报错。
*6、[virtual] bool QSerialPort::isSequential() const
这个函数是QIODevice::isSequential()的继承和重载,函数返回值一直是true,因为串口是一个有序的设备。
*7、[virtual] bool QSerialPort::open(OpenMode mode)
这个函数是QIODevice::open()的继承和重载。这个函数的功能是用“OpenMode”模式打开串口,如果打开成功就返回true,否则就返回false并且会报错,错误码可以通过调用“erro()”函数来查看。
*8、[virtual protected] qint64 QSerialPort::readData(char * data, qint64 maxSize)
这个函数是QIODevice::readData()的继承和重载。
*9、[virtual protected] qint64 QSerialPort::readLineData(char * data, qint64 maxSize)
这个函数是QIODevice::readLineData()的继承和重载。
*10、[virtual] bool QSerialPort::waitForBytesWritten(int msecs)
这个函数是QIODevice::canReadLine()的继承和重载。
*11、[virtual] bool QSerialPort::waitForReadyRead(int msecs)
这个函数是QIODevice::canReadLine()的继承和重载。
*12、[virtual protected] qint64 QSerialPort::writeData(const char * data, qint64 maxSize)
这个函数是QIODevice::writeData()的继承和重载。
4、其他非虚成员函数
*1、bool QSerialPort::clear(Directions directions = AllDirections)
从接收或者发送缓存中丢弃所有字符,“directions”决定了丢弃接收还是发送或者全部。这里包括清空内部类的缓冲和串口(驱动)缓存。
注意:使用clear()函数的时候,串口必须打开,否则会报错。
*2、bool QSerialPort::flush()
这个函数的功能是将内部写缓存中的数据写入到尽可能多地写入到串口中去,而且是无阻塞的。如果写入了任何数据,那么函数返回true,否则就返回false。
调用这个函数就立刻把缓存的数据发到串口。成功写入到串口的数据量取决于操作系统。在大多数情况下,这个函数不需要被调用,因为QSerialPort类会在控件返回到事件循环的时候自动开始发送数据。在非事件循环情况下,可以调用waitForBytesWritten()函数来代替。
注意:使用flush()函数的时候,串口必须打开,否则会报错。
*3、Handle QSerialPort::handle() const
如果平台支持,并且串口也打开了,这个函数会返回本地的串口服务子函数,否则会返回“-1”。
警告:这个功能仅给专家或者内行使用,需要自己承担风险。另外,这个功能在不同的qt版本上不能保证完全通用。这个功能的详细介绍在QT5.2上。
*4、PinoutSignals QSerialPort::pinoutSignals()
以位格式返回总线信号的状态。通过函数返回结果,用掩码“与”运算可以得出你想要的信号的状态,这里的掩码就是QSerialPort::PinoutSignals中枚举出来的值(如下表所示)。
Constant | Value | Description |
QSerialPort::NoSignal | 0x00 | No line active |
QSerialPort::TransmittedDataSignal | 0x01 | TxD (Transmitted Data). This value is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code. |
QSerialPort::ReceivedDataSignal | 0x02 | RxD (Received Data). This value is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code. |
QSerialPort::DataTerminalReadySignal | 0x04 | DTR (Data Terminal Ready). |
QSerialPort::DataCarrierDetectSignal | 0x08 | DCD (Data Carrier Detect). |
QSerialPort::DataSetReadySignal | 0x10 | DSR (Data Set Ready). |
QSerialPort::RingIndicatorSignal | 0x20 | RNG (Ring Indicator). |
QSerialPort::RequestToSendSignal | 0x40 | RTS (Request To Send). |
QSerialPort::ClearToSendSignal | 0x80 | CTS (Clear To Send). |
QSerialPort::SecondaryTransmittedDataSignal | 0x100 | STD (Secondary Transmitted Data). |
QSerialPort::SecondaryReceivedDataSignal | 0x200 | SRD (Secondary Received Data). |
注意:这个函数执行一个系统调用,因此要保证总线信号状态返回正确的值。当底层操作系统不能够对状态变化产生适当提示的时候这个函数就非常必要了。
另外,使用pinoutSignals()函数的时候,串口必须打开,否则会报错。
*5、QString QSerialPort::portName() const
返回串口名,这个串口名字可能是通过setPort()函数设置的,也可能是通过QSerialPort构造器传递过去的。这个名字的规则在上面的构造函数中已经讲过了。可以去上面看一下。
*6、qint64 QSerialPort::readBufferSize() const
返回内部读缓存的大小。这个缓存大小限制了客户端在调用read()或者readAll()函数之前可以接收的数据数量。如果读缓存的大小是0(默认值就是0),那就意味着这个缓存大小是没有限制的,确保了数据可以被完全接收而不丢失。
*7、void QSerialPort::setPort(const QSerialPortInfo & serialPortInfo)
serialPortInfo是一个串口实例,这个函数是用来设置存储它里面的串口信息。
*8、void QSerialPort::setPortName(const QString & name)
设置串口的名字。
串口名可以以一个比较短的名字传递过去,或者,如果实在需要,也可以传递一个比较长的系统的位置。
*9、void QSerialPort::setReadBufferSize(qint64 size)
设置QSerialPort的内部读缓存大小为参数“size”的大小。
如果这个缓存的大小被限制在了某个确定值上,QSerialPort就会严格执行,不会缓存超过其大小的数据。有一种特殊情况,缓存大小是0(默认值就是0),这就意味着读缓存大小没有限制,并且所有进来的数据都会被缓存下来。
这个函数在以下情况下是非常有用的:
1、数据只是在某个特定的时间点来读取(比如:在实时流应用上);
2、保护串口,防止接收过多的数据,因为某些情况下这可能会导致应用超出内存。