QByteArray 的外部与内部声明
External vs internal declaration of QByteArray
我目前在使用 QSerialPort
时遇到了一些问题:当我使用一个示例中的函数时,它看起来像
QKeyEvent *e;
emit getData(e->text().toLocal8Bit());
connect(console, SIGNAL(getData(QByteArray)), this, SLOT(writeData(QByteArray)));
void MainWindow::writeData(const QByteArray &data)
{
qDebug() << "Data is to write: " << data;
serial->write(data);
}
然后接收设备可以处理数据。但是当我将函数 writeData()
更改为
void MainWindow::writeData(const QByteArray &data)
{
QString a = "Q";
QByteArray b = a.toLocal8Bit();
serial->write(b);
}
接收设备无法处理接收到的数据。这两种方法的区别在哪里?
更新:我发现显然只有在输入字母后按 Enter
才能有效地传输数据。 '\n'
在从 QString
到 QByteArray
的转换中以某种方式丢失了。我怎样才能保留它?
在你给出的例子中,QString中没有"\n"!不是迷路,本来就不存在
如果需要换行,则将字符串构造为 QString a = "Q\n"
。
您也可以直接从字符数组构造 QByteArray,而不是通过字符数组 -> QString -> QByteArrray 转换序列,如下所示:
QByteArray b("Q\n");
编辑:我意识到您只是发送字母 "Q" 的人为示例可能是一次调试尝试,而不是您的真实代码。实际上,您正在从其他发出 QByteArray 的信号中获取 QByteArray 形式的数据。您收到的 QByteArray 不能包含换行符。如果您正在读取文件或用户输入,那是正常的。大多数类似 readline 的函数会删除尾随的换行符。如果总是需要一个换行符,你可以简单地在你的 WriteData 方法中做这样的事情:
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
serial->write("\n");
}
如果传入的QByteArray有时末尾有换行有时没有,而你的接收设备无法处理多余的换行,那么你需要检查数据是否以换行结尾,只写“\ n" 如果没有。
如果你把 QByteArray
做成这样会怎样
QByteArray b(&a);
你应该像这样在你的 Qstring 中添加一个输入
QString a = "Q\x00D";
我目前在使用 QSerialPort
时遇到了一些问题:当我使用一个示例中的函数时,它看起来像
QKeyEvent *e;
emit getData(e->text().toLocal8Bit());
connect(console, SIGNAL(getData(QByteArray)), this, SLOT(writeData(QByteArray)));
void MainWindow::writeData(const QByteArray &data)
{
qDebug() << "Data is to write: " << data;
serial->write(data);
}
然后接收设备可以处理数据。但是当我将函数 writeData()
更改为
void MainWindow::writeData(const QByteArray &data)
{
QString a = "Q";
QByteArray b = a.toLocal8Bit();
serial->write(b);
}
接收设备无法处理接收到的数据。这两种方法的区别在哪里?
更新:我发现显然只有在输入字母后按 Enter
才能有效地传输数据。 '\n'
在从 QString
到 QByteArray
的转换中以某种方式丢失了。我怎样才能保留它?
在你给出的例子中,QString中没有"\n"!不是迷路,本来就不存在
如果需要换行,则将字符串构造为 QString a = "Q\n"
。
您也可以直接从字符数组构造 QByteArray,而不是通过字符数组 -> QString -> QByteArrray 转换序列,如下所示:
QByteArray b("Q\n");
编辑:我意识到您只是发送字母 "Q" 的人为示例可能是一次调试尝试,而不是您的真实代码。实际上,您正在从其他发出 QByteArray 的信号中获取 QByteArray 形式的数据。您收到的 QByteArray 不能包含换行符。如果您正在读取文件或用户输入,那是正常的。大多数类似 readline 的函数会删除尾随的换行符。如果总是需要一个换行符,你可以简单地在你的 WriteData 方法中做这样的事情:
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
serial->write("\n");
}
如果传入的QByteArray有时末尾有换行有时没有,而你的接收设备无法处理多余的换行,那么你需要检查数据是否以换行结尾,只写“\ n" 如果没有。
如果你把 QByteArray
做成这样会怎样
QByteArray b(&a);
你应该像这样在你的 Qstring 中添加一个输入
QString a = "Q\x00D";