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>>()的重载函数读取之前有足够的数据。