在Qt中,QSerialPort::write(data) 和 readAll() 有什么关联和联系

在Qt中,QSerialPort::write(data) 和 readAll() 有什么关联和联系

码农世界 2024-06-18 后端 83 次浏览 0个评论

在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() 接收数据。这两个函数协同工作,实现了串行端口的基本通信功能。

转载请注明来自码农世界,本文标题:《在Qt中,QSerialPort::write(data) 和 readAll() 有什么关联和联系》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,83人围观)参与讨论

还没有评论,来说两句吧...

Top