2016-05-02 16 views
0

Arduinoからシリアルデータを読み込んでUIに送信するのに問題があります。すべてのシリアルデータを3つの別々の変数に分割するのは面倒で、特定の数値を得るためには左と中央を使いました。今の問題は、LCDディスプレイで変化するのがわかるのに、私が得た数字は変わらないということです。シリアル通信でQStringの数字が同じになる

void Dolle::serialReceived(){ 
    ba = serial->readAll(); 

    serialBuffer += QString::fromStdString(ba.toStdString()); 

    QString bufferSplit = serialBuffer; 

    QString hum = bufferSplit.left(2); 
    QString temp = bufferSplit.mid(2, 2); 
    QString gas = bufferSplit.mid(4, 4); 

    if((hum.size()==2) && (temp.size()==2) && (gas.size()==4)){ 
    ui->humLabel->setText("Humidity:  "+hum+" %"); 
    ui->tempLabel->setText("Temperature: "+temp+(char(176))+ "C"); 
    ui->gasLabel->setText("Gas level:   "+gas); 
    qDebug() << hum << temp << gas; 
    } 
} 
+1

バッファにデータを追加しますが、同じ位置からデータを読み取り、それをラベルに設定します。あなたは 'serialBuffer = QString :: fromStdString(ba.toStdString());'ではないと確信していますか?また 'stdString'変換も不要です。 – thuga

+0

私はこれをしました。なぜなら、ターミナルに流出した数字は何の順序もなくランダムにまとめられていたからです。また、baはQByteArrayであり、変換が必要だと思った理由です。 – giggitygoat

+0

どちらにせよ、あなたは 'serialBuffer'から同じデータを繰り返し読み込んでいます。 – thuga

答えて

1

はいくつかの問題があります:
これは、コードのセクションであるあなたがserialBufferに追加している

  1. が、あなたはそれを空にすることはありません。 QIODeviceは内部のサイズ変更可能な循環バッファをすでに保持しているので、2番目の循環バッファは不要です。

  2. バイナリ表現からQStringにはstd::stringを使用しています。それはまったく必要ありません。

  3. バイナリデータで使用されている文字エンコーディングについては明示的ではありません。

  4. UIは、readyRead信号ごとに最大1回ではなく、繰り返し更新されます。

  5. あなたは魔法の定数を使用しています。代わりにUTF-8でソースをエンコードするか、名前がQCharの定数を使用する必要があります。

  6. 文字列演算子を使用して手作業で文字列を作成しているため、国際化とメンテナンスが妨げられます。

  7. UIで表示を調整するためのメカニズムとしてスペースを使用しています。おそらく、UIを別のやり方でデザインする必要があります。そのようなハッキングは必要ないでしょう。

私はあなたの文字列が何らかの形で分離されていると推測します - おそらくそれぞれ別々の行にありますか?いずれにしても、区切られた完全な文字列は、使用可能な限り、デバイスから読み続ける必要があります。 QIODevice::readLine方法は、行区切りデータの場合には、それが容易になります:

void Dolle::serialReceived() { 
    QString validLine; 
    while (serial->canReadLine()) { 
    auto binLine = serial->readLine(); 
    auto line = QString::fromLatin1(binLine); 
    if (line.length() < 8) 
     continue; 
    validLine = line; 
    } 
    if (validLine.isEmpty()) return; 
    auto hum = line.left(2); 
    auto temp = line.mid(2, 2); 
    auto gas = line.mid(4, 4); 
    ui->humLabel->setText(QStringLiteral("Humidity: %1%").arg(hum)); 
    ui->tempLabel->setText(QStringLiteral("Temperature: %1°C").arg(temp)); 
    ui->gasLabel->setText(QStringLiteral("Gas level: %1").arg(gas)); 
} 

ではなくラインで区切られたデータを、あなたのデータは固定サイズのチャンクで到着すると仮定します。

void Dolle::serialReceived() { 
    QString validPacket; 
    while (serial->bytesAvailable() >= 8) { 
    auto bin = serial->read(8); 
    auto packet = QString::fromLatin1(bin); 
    if (packet.length() < 8) 
     continue; 
    validPacket = packet; 
    } 
    ... 
} 
関連する問題