0

我正在使用类readAll()方法QSerialPort从虚拟 COM 端口读取数据。

我从我的硬件板上得到两个响应。
1.确认("10")字符串
2.查询数据(";1395994881;1.0.0")字符串数据
作为QByteArray : 10\x00;1395994881;1.0.0

我想\x00从我的QByteArray.

每当我试图对我的 QByteArray 执行任何操作时,我都会执行第一部分,QByteArray即 ``10 。剩下的部分被跳过了;1395994881;1.0.0

如果有任何方法可以\x00从 中删除此字符,请指导我QByteArray

代码
QByteArray data = serial.readAll(); //("10\x00;1395994881;1.0.0");

  1. 试用: QList<QByteArray> list = data.split('\x00'); qDebug()<<list; // 10

  2. 试用: qDebug()<<data.remove(2, 1); //10

  3. 试用: qDebug()<<QString(data); //10

  4. 试用: qDebug()<<data.replace('\x00', ""); //10

  5. 试用: Used Loop to go byte by byte, but same result

无论如何,我希望将结果字符串作为单个字符串或拆分。但是需要完整的字符串,例如10;1395994881;1.0.0or10;1395994881;1.0.0

我还提到了以下Stack Overflow问题。
1. 2. 3.QByteArray to QString
Remove null from string:Java
Code Project

编辑

//Function to read data from serial port  
void ComPortThread::readData()
{
    if(m_isComPortOpen) {
        //Receive data from serial port
        m_serial->waitForReadyRead(500); //Wait 0.5 sec
        QByteArray data = m_serial->readAll();
        if(!data.isEmpty()) {
            qDebug()<<"Data: "<<data;  //10\x00;1395994881;1.0.0
            //TODO: Separate out two responce like "10" and ";1395994881;1.0.0"
            //Problem : Unable to split data into two parts.
            emit readyToRead(data);
        }
    }
}

请帮助我。

4

1 回答 1

1

串行端口返回的QByteArray值是从原始数据创建的,其行为不像字符串。为了处理整个数组,您可以使用 STL 样式的迭代器,它对包含的NULL字符很健壮。有关fromRawData数组的更多信息,请仔细阅读文档中的详细说明

这是一个肮脏的例子,展示了如何修复你的字符串:

const char mydata[] = {
    '1', '0', 0x00, ';', '1', '3', '9', '5', '9', '9', '4', '8', '8', '1', ';', '1', '.', '0', '.', '0'
};
QByteArray data = QByteArray::fromRawData(mydata, sizeof(mydata));
qDebug() << data; // "10\x00;1395994881;1.0.0"

char fixed[255];
int index = 0;
QByteArray::iterator iter = data.begin();
while(iter != data.end())
{
    QChar c = *iter;
    if (c != '\0') fixed[index++] = c.toLatin1();
    iter++;
}
fixed[index] = '\0';

qDebug() << fixed; // 10;1395994881;1.0.0
于 2018-03-08T11:50:48.090 回答