我希望读取一些字符或字符串,并通过Qt 4.8.6从串口显示QTextBrowser并调用以下函数(文本Browser是QTextBrowser的对象):
connect(com, SIGNAL(readyRead()), this, SLOT(readSerialPort()));
connect(textBrowser, SIGNAL(textChanged()), SimApplianceQtClass, SLOT(on_textBrowser_textChanged()));
void SimApplianceQt::on_textBrower_textChanged()
{
ui.textBrowser->moveCursor(QTextCursor::End);
}
void SimApplianceQt::readSerialPort()
{
QByteArray temp = com->readAll();
ui.textBrowser->insertPlainText(temp);
}
但是,每次我都无法正确显示textBrowser中的字符或字符串。这些输入字符串总是被切割成较小的字符串,以便在textBrowser中以多行显示。例如,字符串“0123456789”可能会显示为(多行):
01 2345 6789
如何处理这个问题?非常感谢。
发生的事情是,readyRead
信号不会在收到所有内容后触发,而是在收到某些内容并准备好读取之后触发。
当您收到第一张readyRead
时,无法保证所有内容都已到达或可读。
对于几乎任何类型的IO来说,这是一个常见的“问题”,特别是如果数据大于非常少的字节。通常没有自动方式知道何时收到所有数据。
有几种可能的解决方案: 所有这些都需要您将数据放在readSerialPort()中的缓冲区中,而不是直接将其添加到文本浏览器中。也许SimApplianceQt中的一个简单的QByteArray成员变量已经可以解决你的问题了。
其余的取决于确切的解决方案。