QSerialPort 正确发送多行

Posted

技术标签:

【中文标题】QSerialPort 正确发送多行【英文标题】:QSerialPort proper sending of many lines 【发布时间】:2015-02-27 17:27:14 【问题描述】:

我正在尝试使用 QSerialPort (QT 5.3.1) 将非常大的文件写入串行端口。问题是 - 我不断发送超出设备可以处理的内容。 程序是这样工作的(这个函数在 50 毫秒内调用一次):

void MainWindow::sendNext()

    if(sending && !paused && port.isWritable())
    
        if(currentLine >= gcode.size()) //check if we are at the end of array
        
            sending = false;
            currentLine = 0;
            ui->sendBtn->setText("Send");
            ui->pauseBtn->setDisabled("true");
            return;
        
        if(sendLine(gcode.at(currentLine))) currentLine++; //check if this was written to a serial port
        ui->filelines->setText(QString::number(gcode.size()) + QString("/") + QString::number(currentLine) + QString(" Lines"));
        ui->progressBar->setValue(((float)currentLine/gcode.size()) * 100);
    

但它最终会出现缺陷并挂起(在设备上,而不是在 PC 上)。如果我能以某种方式检查设备是否已准备好用于下一行,但我在 QSerial 文档中找不到类似的东西。 有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以使用QSerialPort::waitForBytesWritten 来确保写入字节。但是这个函数会阻塞线程,建议在新线程中使用它,否则你的主线程会被阻塞并且你的应用程序会定期冻结。

【讨论】:

谢谢,这正是我想要的! 如果我没记错的话,这个建议只会在你溢出 PC 端的输出缓冲区时有帮助(基本上是通过尝试写入超过配置的波特率,从而逐渐填满输出缓冲)。但是,如果设备输入缓冲区是问题(更有可能),riodoro1 的答案更有用:使用串行协议的流控制功能。参见 QSerialPort::setFlowControl 和 requestToSend/dataTerminalReady,只有在设备报告它准备好时才继续发送。【参考方案2】:

RS232 确实具有一些流量控制功能。 检查您的设备是否使用 RTS/CTS,如果是,请更改连接属性以使用硬件流控制。 QSerialPort 还允许使用dataTerminalReadyrequestToSend 手动检查流控制线

【讨论】:

即使是软件流控制 (setFlowControl(QSerialPort::SoftwareControl)) 也应该可以解决发布者的问题。

以上是关于QSerialPort 正确发送多行的主要内容,如果未能解决你的问题,请参考以下文章

使用 QSerialPort 通过串口发送数据

qserialport 不向 arduino 发送字符

读写串口 类QSerialPort

QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)

QThread 与 QTimer 和 QSerial - 育儿

多线程代码中 QSerialPort 的 Qt 错误:QCoreApplication::sendEvent:“无法将事件发送到不同线程拥有的对象