詳細描述:
QSerialPort類提供了訪問串口的功能。
你可以用QSerialPortInfo輔助類獲得可用的串口信息,輔助類列舉了系統所有的串口。這有利於你獲取你需要的串口的正確名稱。你可以將一個輔助類的對象作為參數傳遞給setPort() 或者 setPortName()函數,這可以指定你所需要的串口設備。
在設置串口之后,你可以調用open()函數,以只讀(r/o)、只寫(w/o)或者讀寫(r/w)模式打開串口。
注意:串口總是以獨占的方式打開的(也即其他的進程或者線程都不能訪問一個已經打開的串口)。
在成功打開串口之后,QSerialPort類設法決定串口的當前配置,並初始化串口。你可以調用 setBaudRate(), setDataBits(), setParity(),setStopBits(), 以及setFlowControl()函數將串口重新配置成為需要的設置。
控制引腳信號的狀態由isDataTerminalReady(), isRequestToSend, 以及pinoutSignals()函數決定。可以通過調用setDataTerminalReady()和setRequestToSend()函數改變控制信號線的狀態。
一旦知道串口已經可以讀或寫,你可以調用read() 或者write()函數去讀或者寫串口。另外也可以方便的調用readLine() 和readAll()函數。若沒有立即讀取所有的數據,那么剩下的數據將會作為新傳入的數據追加到QSerialPort類內部的讀取緩沖區中。你可以通過調用 setReadBufferSize()函數限制讀取緩沖區的大小。
調用close()函數可以關閉串口並取消I/O操作。
看下面的例子:
int numRead = 0, numReadTotal = 0; char buffer[50]; forever { numRead = serial.read(buffer, 50); // Do whatever with the array
numReadTotal += numRead; if (numRead == 0 && !serial.waitForReadyRead()) break; }
如果waitForReadyRead()返回了false,那么連接已經關閉或者發生了一個錯誤。
阻塞的串口編程和不阻塞的串口編程本質上是不一樣的。阻塞的串口編程不需要一個事件循環並且通常需要的代碼很少。但在一個GUI程序中,阻塞串口只能在非GUI線程中使用,這樣可以避免界面凍結。
關於這些方法的詳細信息,可以參閱示例程序。
QSerialPort類也可以和QTextStream 和QDataStream的流操作(operator<<() 和operator>>())一起使用。但有一點需要注意的是,確保在設法通過operator>>()的重載函數讀取之前有足夠的數據。

