QT QIODevice类

The QIODevice class is the base interface class of all I/O devices in Qt.

QIODevice为了支持读写块数据,提供了一个共同的实现和一个通用的接口,这些块数据如: QFile, QBuffer 和 QTcpSocket.
QIODevice是abstract不能instantiated, 但通常会用到它定义的接口,这些接口提供设备无关的I/O特性。例如Qt的XML类通过操作一个QIODevice 的指针,可以使用各种各样的设备(files,buffers等)。
在访问设备之前,必须先调用open(),并设置正确的OpenMode(such as ReadOnly or ReadWrite)。你可以用write(),putChar()来写入设备。也可以用read(),readLine()来读设备。使用完毕后调用close().
QIODevice distinguishes between two types of devices: random-access devices and sequential devices.
random-access devices(随机访问设备):support seeking to arbitrary positions using seek(). The current position in the file is available by calling pos(). QFile and QBuffer are examples of random-access devices.
sequential devices(顺序访问设备): don't support seeking to arbitrary positions. The data must be read in one pass. The functions pos() and size() don't work for sequential devices. QTcpSocket and QProcess are examples of sequential devices.
可以使用 isSequential()判断设备的类型

 QTcpSocket and QProcess是QIODevice的子类,是异步的,这意味着 I/O 函数 write() or read()的结果总是立即返回,然而,当控件返回到事件循环时,可能会发生与设备本身的通信。QIODevice提供函数在阻塞调用线程和不输入事件循环的同时,允许程序立即执行,这使得QIODevice的子类可以被使用,在没有循环事件或者是单线程的条件下:

waitForReadyRead()将阻塞线程直到数据到来。

waitForBytesWriten()将阻塞线程直到数据写入。

waitFor...()子类会实现相应的函数为了特殊的操作。比如QProcess 有个叫waitForStarted()的函数。它将会延迟调用的线程,直到那个process已经启动。

QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
    return false;

gzip.write("uncompressed data");

QByteArray compressed;
while (gzip.waitForReadyRead())
    compressed += gzip.readAll();

通过子类化QIODevice ,可以提供相同的接口为自己 I/O设备。QIODevice的子类仅需要实现protected的readData()和writeData(),QIODevice 用这些函数实现了其他方便使用的函数。例如getChar(),readLine()和write()。QIODevice 可以为你提供访问控制,如果你已经调用writeData()函数,就可以认为设备已打开。

一些子类,如QFile 和QTcpSocket,会使用内存缓冲区实现存储临时的数据,这将减少设备访问的次数,设备访问的效率很低。Buffering makes functions like getChar() and putChar() fast, as they can operate on the memory buffer instead of directly on the device itself.(当你在内存缓冲区中操作数据而不是和访问设备本身。

成员函数:

	QIODevice()
QIODevice(QObject * parent)
virtual	~QIODevice()
virtual bool	atEnd() const
virtual qint64	bytesAvailable() const
virtual qint64	bytesToWrite() const
virtual bool	canReadLine() const
virtual void	close()
QString	errorString() const
bool	getChar(char * c)
bool	isOpen() const
bool	isReadable() const
virtual bool	isSequential() const
bool	isTextModeEnabled() const
bool	isWritable() const
virtual bool	open(OpenMode mode)
OpenMode	openMode() const
qint64	peek(char * data, qint64 maxSize)
QByteArray	peek(qint64 maxSize)
virtual qint64	pos() const
bool	putChar(char c)
qint64	read(char * data, qint64 maxSize)
QByteArray	read(qint64 maxSize)
QByteArray	readAll()
qint64	readLine(char * data, qint64 maxSize)
QByteArray	readLine(qint64 maxSize = 0)
virtual bool	reset()
virtual bool	seek(qint64 pos)
void	setTextModeEnabled(bool enabled)
virtual qint64	size() const
void	ungetChar(char c)
virtual bool	waitForBytesWritten(int msecs)
virtual bool	waitForReadyRead(int msecs)
qint64	write(const char * data, qint64 maxSize)
qint64	write(const char * data)
qint64	write(const QByteArray & byteArray)

Signals:

void	aboutToClose()
void	bytesWritten(qint64 bytes)
void	readChannelFinished()
void	readyRead()

Protected Functions
virtual qint64	readData(char * data, qint64 maxSize) = 0
virtual qint64	readLineData(char * data, qint64 maxSize)
void	setErrorString(const QString & str)
void	setOpenMode(OpenMode openMode)
virtual qint64	writeData(const char * data, qint64 maxSize) = 0





  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一款跨平台的开发框架,其中的SerialPort可以用来与串行设备进行通信。CDC(Communication Device Class)是一种通信设备别,是一种通用的串行设备协议。 Qt的SerialPort提供了一套方便易用的接口,可以用来访问串行端口进行读写操作。它提供了许多函数和信号槽,可以实现的功能包括打开和关闭端口、设置波特率、数据位、校验位等通信参数、读取和写入数据等。通过这些函数,我们可以轻松地进行串行通信。 对于CDC设备,我们可以使用Qt的SerialPort实现与之通信。CDC设备一般都支持标准的串行通信协议,因此可以使用Qt的SerialPort提供的功能进行数据的读写。我们只需要打开串行端口,设置好通信参数,然后通过SerialPort的写入函数发送数据,通过读取函数读取设备返回的数据即可。 为了使用SerialPort来与CDC设备进行通信,我们需要先包含相应的头文件,并链接SerialPort库。然后我们可以在代码中实例化一个SerialPort对象,并设置好通信参数。通过调用对象的打开函数,我们就可以将该串口打开。接下来我们就可以调用SerialPort对象的写入函数发送数据,或者通过读取函数读取设备返回的数据。 总之,Qt的SerialPort提供了一套方便易用的接口,可以用来与串行设备进行通信。而CDC是一种通信设备别,通过使用Qt的SerialPort,我们可以很方便地实现与CDC设备的通信。 ### 回答2: SerialPort Qt 提供的用于处理串口通信的,CDC (Communication Device Class) 是一种标准的 USB 设备别之一,用于处理通信设备的驱动程序和通信协议。 Qt 的 SerialPort 支持与 CDC 设备进行通信。它通过提供一组方法和信号来实现与串口的交互。Qt 的 SerialPort 可以完成打开、关闭、读取、写入等串口操作。通过使用该,我们可以通过串口与 CDC 设备进行数据的发送和接收。 在使用 SerialPort 与 CDC 设备通信时,我们首先需要创建一个 SerialPort 实例,并指定串口的属性,如波特率、数据位、校验位和停止位。然后,我们可以打开串口并通过 write() 方法向 CDC 设备发送数据,或通过 readAll() 方法从 CDC 设备读取数据。 除了基本的串口操作外,SerialPort 还提供了一些与 CDC 设备通信相关的特殊功能,如设置流控制协议、设置数据流控制模式等。这些功能可以根据具体的应用需求进行使用。 总之,Qt 的 SerialPort 提供了一种方便和灵活的方式来与 CDC 设备进行通信。通过使用该,我们可以很容易地实现串口与 CDC 设备之间的数据交换,满足各种通信需求。 ### 回答3: Qt SerialPort 提供了一种简便的方式来与串口进行通信,并且支持 CDC(Communications Device Class)。 CDC 是一种用于串行通信设备的通用设备。它定义了一组通信设备的标准模型和规范,旨在在各种操作系统上实现串口设备的兼容性。 在 Qt 中,我们可以使用 SerialPort 来实现与 CDC 兼容的串口设备的通信。这个提供了一组方法来设置和控制串口的属性,如波特率、数据位、停止位和校验位等。我们可以使用这些方法来配置和初始化串口设备。 我们可以使用 SerialPort 的 `open` 方法打开一个串口设备,并且可以通过 `read` 和 `write` 方法来读取和写入数据。read 方法用于从串口设备中读取数据,write 方法用于向串口设备中写入数据。 使用 Qt SerialPort 与 CDC 兼容的串口设备进行通信的示例代码如下: ``` c++ #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> int main() { QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud115200); serial.setDataBits(QSerialPort::Data8); serial.setStopBits(QSerialPort::OneStop); serial.setParity(QSerialPort::NoParity); if (serial.open(QIODevice::ReadWrite)) { // 读取数据 QByteArray data = serial.readAll(); // 处理数据 // 写入数据 QString message = "Hello, World!"; serial.write(message.toUtf8()); } serial.close(); return 0; } ``` 上述示例代码中,我们创建了一个 SerialPort 对象,并设置了串口设备的属性。然后,我们打开了串口设备,并使用 read 方法读取设备上的数据,并使用 write 方法向设备写入数据。最后,我们关闭了串口设备。 通过 Qt SerialPort 以及与 CDC 兼容的串口设备,我们可以实现方便且灵活的串口通信功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值