我在Qt C++中有一个自定义信号槽,我想在其中存储从串行端口接收的数据(QSerialPort)来显示来自嵌入式系统上25个不同传感器的数据。传感器的值范围从5900到7200,所以我想发送一个不同的字母作为字符(范围从a到y,25个字母),所以我的Qt程序可以判断接下来接收哪个传感器数据,后面跟着一个停止字节,这对我的25个传感器是通用的。
void MainWindow::serialReceived() // runs individually for almost every byte
{
QByteArray ba = serial->readAll();
qDebug() << ba.size();
}
现在,我使用readAll()函数,并且大多数时候,这个slot函数(serialReceived())被足够频繁地调用,使得一次仅接收到1个字符,因此我可以检查标识传感器的字母,然后在下一个函数调用时,我可以检查传感器数据的最左边的数字,等等,直到我到达第4个数字,然后到达停止字节,然后重复该过程。
问题是有时它一次接收多个字节,所以如果ba中有多个值,我不知道检查接收的各个字节的好方法(例如:我是否收到一封信,后面是下一个探头值的前2个数字??)。
到目前为止,我已经做到了这一点,但它不起作用,因为我在插槽函数中一次读取超过1个字节时就会出现问题:
void MainWindow::serialReceived() // runs individually for almost every byte
{
static char stepFlag = 0;
QByteArray ba = serial->readAll();
qDebug() << ba.size(); //receives 1 byte and
QString s;
s = QString::number(stepFlag), qDebug() <<"step: "<< s;
qDebug() <<"ba: " << ba;
if (ba == "<") stepFlag = 1, s = QString::number(stepFlag), qDebug() << s;
s = QString::number(currentSensorValue), qDebug() << s;
switch (stepFlag) {
case 0:
qDebug() << "starts";
if (ba == "<")
stepFlag = 1;
break;
case 1:
ID = ba.toInt();
qDebug() << ID;
stepFlag = 2;
break;
case 2:
stepFlag++;
currentSensorValue = ba.toInt()*1000; // first char is the 1st number of data (representing thousands)
break;
case 3:
stepFlag++;
currentSensorValue += ba.toInt()*100;
break;
case 4:
stepFlag++;
currentSensorValue += ba.toInt()*10;
break;
case 5:
stepFlag++;
currentSensorValue += ba.toInt();
break;
case 6:
//qDebug() << "a" << currentSensorValue;
if (ba.toInt() == 'r')
{
switch (ID)
{
case 'a':
ui->RX0TX0_LCD->display(currentSensorValue);
qDebug() << "a" << currentSensorValue;
break;
case 'b':
qDebug() << "b" << currentSensorValue;
break;
//This switch would go on for all of the 25 letters (sensors)
default:
break;
}
ID = 0;
}
if (ba.toInt() == 'n')
{
stepFlag = 0;
}
break;
default:
break;
}
}
所以基本上我的问题是我如何从QserialPort一次读取一个字节,这样这个问题就不会再出现了?我也不确定我的接收字符的方法是否非常有效。谢谢!
1条答案
按热度按时间9lowa7mx1#
您可以通过QByteArray迭代每个字节,如下所示: