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 还允许使用dataTerminalReady
或requestToSend
手动检查流控制线
【讨论】:
即使是软件流控制 (setFlowControl(QSerialPort::SoftwareControl)
) 也应该可以解决发布者的问题。以上是关于QSerialPort 正确发送多行的主要内容,如果未能解决你的问题,请参考以下文章
QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)
QThread 与 QTimer 和 QSerial - 育儿
多线程代码中 QSerialPort 的 Qt 错误:QCoreApplication::sendEvent:“无法将事件发送到不同线程拥有的对象