天天看點

QT學習筆記QserialPort類學習(二):QSerialPort的成員函數

上次沒寫完的,接着寫完。接着寫一下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、保護序列槽,防止接收過多的資料,因為某些情況下這可能會導緻應用超出記憶體。

就這麼多了,感謝勤勞的我~(見笑了)

繼續閱讀