#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray dataReceivedFromSerialPort;
dataReceivedFromSerialPort.push_back(0x0A);
dataReceivedFromSerialPort.push_back(0x0B);
dataReceivedFromSerialPort.push_back(0x0C);
dataReceivedFromSerialPort.push_back(0x0D);
dataReceivedFromSerialPort.push_back(0x0E);
dataReceivedFromSerialPort.push_back(0x0F);
dataReceivedFromSerialPort.push_back(0x07);
dataReceivedFromSerialPort.push_back(0x02);
dataReceivedFromSerialPort.push_back(0x01);
dataReceivedFromSerialPort.push_back(0x02);
qDebug() << "tostr: " << dataReceivedFromSerialPort.toStdString().c_str();
return a.exec();
}
上面没有打印任何值。除了"tostr:"之外,它不会打印任何内容。如果我在uchar中存储0x0A,然后在qByteArray中推送它,那么这个问题就会消失。
如何将其打印为当前形式?
因为在许多编码中,您给出的字节是各种控制字符(换行符、回车符等(。经过std::string
和char*
意味着字节将按原样发送到终端,并以这种方式显示(要么根本不显示,要么显示为各种类型的空白(。
你可以试着做其中一个,这取决于你想要什么:
qDebug() << dataFromSerialPort; // prints "nx0Bfrx0Ex0Fx07x02x01x02"
qDebug() << QString::fromLatin1(dataFromSerialPort); // prints "nu000Bfru000Eu000Fu0007u0002u0001u0002"
qDebug() << dataFromSerialPort.toHex(); // "0a0b0c0d0e0f07020102"
qDebug() << qPrintable(dataFromSerialPort); // same as toStdString().c_str(), but IMO more readable.
这些以各种转义序列打印字节(QString使用unicode,这就是为什么您在那里看到\u而不是\x(,作为可读的十六进制表示形式以及"原样"。
QDebug对许多已知的类型进行特殊格式化,如QString和QByteArray,这就是为什么上面的前三个例子用引号打印并写出转义序列(毕竟是为了调试(。qPrintable的工作原理与toStdString().c_str()
非常相似,它返回一个char*,QDebug不会以任何特殊的方式对其进行格式化,这就是为什么您将空白作为输出(这与std::cout
和friends的行为相同(。