在Qt中,QSerialPort::write(data) 和 readAll() 是与串行通信相关的两个不同的函数,它们属于 QSerialPort 类。这两个函数在串行通信中扮演不同的角色,但它们之间存在一定的联系:
QSerialPort::write(data)
- 这个函数用于将数据发送到串行端口。它接受一个 QByteArray 类型的数据参数,并将这些数据写入串行端口的发送缓冲区。
- write() 函数本身不保证数据立即发送到外部设备,而是将数据放入缓冲区,等待串行端口硬件或驱动程序将其发送出去。
- 函数原型:
qint64 write(const QByteArray &data);
- 返回值是实际写入的字节数。
readAll()
- 这个函数用于从串行端口的接收缓冲区读取所有可用的数据,并将其作为 QByteArray 返回。
- readAll() 会阻塞调用线程,直到缓冲区中的数据被完全读取,或者遇到超时(如果有设置超时)。
- 函数原型:
QByteArray readAll();
联系
- 数据流向:write() 函数负责发送数据,而 readAll() 负责接收数据。在串行通信中,数据从发送方的发送缓冲区通过串行端口发送出去,然后在接收方的串行端口接收缓冲区中被读取。
- 缓冲区操作:write() 操作的是发送缓冲区,而 readAll() 操作的是接收缓冲区。这两个缓冲区是串行通信中数据传输的临时存储区域。
- 通信对等:在一个完整的串行通信过程中,发送方使用 write() 发送数据,接收方使用 readAll() 或其他读取函数来接收数据。这两个操作共同完成了数据的发送和接收过程。
示例
QSerialPort serialPort; serialPort.setPortName("/dev/ttyS0"); // 设置串行端口名称 serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率 serialPort.open(QIODevice::ReadWrite); // 打开串行端口 if (serialPort.isOpen()) { // 发送数据 QByteArray dataToSend = "Hello, Serial Port!"; qint64 bytesWritten = serialPort.write(dataToSend); qDebug() << "Bytes written:" << bytesWritten; // 接收数据 QByteArray dataReceived = serialPort.readAll(); qDebug() << "Data received:" << dataReceived; serialPort.close(); // 关闭串行端口 }
在这个示例中,我们首先打开串行端口,然后使用 write() 发送数据,接着使用 readAll() 接收数据。这两个函数协同工作,实现了串行端口的基本通信功能。
还没有评论,来说两句吧...