4

シリアルポートから情報を読み取っています。改行が入るのを待ってから、データを処理するにはどうすればよいですか? つまり、一度に行全体をチャンクしていることを確認するにはどうすればよいですか。

このコードは機能しません:

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\n」を送信するとします。
データには、「Se」、「n」、「sor 2」、「00\n」などが含まれる場合があります。

テキスト行ができるまで parseData の呼び出しをブロックするにはどうすればよいですか?

追加情報:
readData はスロットとして設定されます:

    connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
4

2 に答える 2

3

SerialPort readLine() 関数を使用してみませんでしたか? 各 readline() の後、その行を新しい ByteArray または QString に送信して解析することができます。また、最後に .trimmed() を使用して '\r' および '\n' 文字を削除するので、次のようなことができます。

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 
       }
 }
于 2014-07-23T20:59:49.207 に答える