私はプログラミングに精通していますが、c++ / qt の世界は初めてです。
QtExtSerialPort ライブラリを使用して arduino ボードから入力を読み取るように、qwt ライブラリのオシロスコープの例を変更しています。(はい、私は QtSerial について知っていますが、それを発見したとき、私は実装に少し行き過ぎていました)
arduino はシリアル ポートに値を書き込みます。
1.23
2.33
4.56
2.12
0.32
など。PC がデータを読み取るとき、データはチャンクで読み込まれるため、1 回の読み取りで次のような結果が得られる場合があります。
3
2.33
4
そして次回
.56
2.
等々。
リーダー スレッドのヘッダー ファイルで、
QString buffer;
そして、読むとき、私はこの関数を使用しています:
double SamplingThread::value( double timeStamp ) const
{
double v;
QByteArray inpt;
int a = port->bytesAvailable();
inpt.resize(a);
port->read(inpt.data(), inpt.size());
QString strng=buffer+QString::fromAscii(inpt);
// This concatenates what is left over since last time to what is read now:
int j=strng.indexOf("\n");
if(j>-1){
// if a newline, ie the first number is complete
QString s=strng.left(j-1);
v=s.toFloat();
s=strng.mid(j+1,-1); // What is to be saved to next time
buffer =s; // store it in the global buffer
return v*d_amplitude/5;
}
}
(はい、2 つの \n を含むチャンクを読み取るとすぐに問題が発生することはわかっています)
グローバルバッファに残っているものを保存できないことを除いて、これは正常に機能します。その行でエラーが発生します:
samplingthread.cpp:89: error: no match for 'operator*=' in
'((const SamplingThread*)this)->SamplingThread::buffer *= s'
これが何を意味するのか、私は常に困惑しています。QString を別の QString にコピーするつもりでしたが ... ? どこかでポインターを台無しにしてしまったことがありますか? たった1行でやるのと何が違うの?( s=strng.right(j+1) )