我很擅长编程,但对 c++/qt 的世界很陌生。
我一直在修改 qwt 库中的示波器示例,以使用 QtExtSerialPort 库从 arduino 板读取输入。(是的,我知道 QtSerial,但是当我发现时,我对实现有点太远了)
arduino 将值写入串行端口,一行一个数字,如
1.23
2.33
4.56
2.12
0.32
等等。当 PC 读取数据时,它以块的形式进入,所以在一次读取中,我可能会得到类似的东西
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;
}
}
(是的,我知道一旦我读到一个包含两个 \n 的块,我就会遇到问题)
这很好用,除了我无法存储全局缓冲区中剩下的内容。在那一行我得到错误:
samplingthread.cpp:89: error: no match for 'operator*=' in
'((const SamplingThread*)this)->SamplingThread::buffer *= s'
我一直对这意味着什么感到困惑。我打算将一个 QString 复制到另一个 QString - 但是......?我是否在某处用指针弄乱了一些东西,但如果是这样,为什么我可以将 QStrings 分配给其他地方?和我只做一条线有什么区别?( s=strng.right(j+1) )