2013-07-17 4 views
3

Я читаю информацию из последовательного порта. Как ждать появления новой строки, а затем обрабатывать данные? То есть, как я могу убедиться, что я цепляю целую строку за раз.Qt QSerialPort буферизация

Этот код не работает:

void MainWindow::readData() 
{ 
    QByteArray data = serial->readAll(); //reads in one character at a time (or maybe more) 
    console->putData(data); 
    charBuffer.append(data); 
    if (data.contains("\n")) //read into a structure until newline received. 
    { 
     //call parsedata 
     sensorValues->parseData(charBuffer); //send the data to be parsed. 
     //empty out the structure 
     charBuffer = ""; 
    } 
} 

Скажем, последовательный порт посылает "SENSOR1 200 \ п".
данные могут содержать следующее: «Se», затем «n», «sor 2» «00 \ n» и т. Д.

Как заблокировать вызов parseData до тех пор, пока у меня не будет строки текста?

Дополнительная информация:
readData устанавливается как слот:

connect(serial, SIGNAL(readyRead()), this, SLOT(readData())); 
+1

Это не (почти), что делает ваш код? Помимо того, что если вы получаете «200 \ nSensor5» в одном вызове readData(), часть «Sensor5» будет передана parseData как часть предыдущей строки и не будет включена в начало следующей строки, отправленной в parseData – Pete

+0

, когда вы говорите «этот код не работает», какой результат вы получаете? – Pete

+0

Я получаю смешанный выход выше. Решение найдено: block on canReadLine(); – Dirk

ответ

3

Вы не пытались с помощью SerialPort ReadLine() функцию? после каждого readline() вы можете отправить строку в какой-то новый ByteArray или QString для разбора. Я также использую .trimmed() на конце, чтобы удалить «\ г» и «\ п» символов, так что я могу сделать что-то вроде этого:

void MainWindow::readData() 
{ 
    while (serial->canReadLine()){ 
     QByteArray data = serial->readLine(); //reads in data line by line, separated by \n or \r characters 
     parseBytes(data.trimmed()) ; 
    } 
} 

void MainWindow::parseBytes(const QByteArray &data) <--which needs to be moved to  separate class, but here it's in the MainWindow, obviously improper 
{ 
     if (data.contains("1b0:")) 
     { 
      channel1Data.b0_code = data.mid(5); // which equals "1", 
      //do stuff or feed channel1Data.b0_code to a control 
     } 
} 
1

Сделать статические переменные, а затем хранить данные до тех пор, пока есть \ п

void readData() 
{ 
    // Read data 
    static QByteArray byteArray; 
    byteArray += pSerialPort->readAll(); 

    //we want to read all message not only chunks 
    if(!QString(byteArray).contains("\n")) 
     return; 

    //sanitize data 
    QString data = QString(byteArray).remove("\r").remove("\n"); 
    byteArray.clear(); 

    // Print data 
    qDebug() << "RECV: " << data; 

    //Now send data to be parsed 
} 
Смежные вопросы