c++ 我如何在QByteArray中逐个地迭代字节?

xj3cbfub  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(166)

我在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一次读取一个字节,这样这个问题就不会再出现了?我也不确定我的接收字符的方法是否非常有效。谢谢!

9lowa7mx

9lowa7mx1#

您可以通过QByteArray迭代每个字节,如下所示:

QByteArray::iterator iteratorByte;
int count = 0;
for (iteratorByte = ba.begin(); iteratorByte != ba.end() ; iteratorByte++ ) {
    QByteArray test1Byte(1,0); //Define a 1 Byte fixed length variable
    test1Byte[0]= ba.at(count++); //Assign each byte of the QByteArray ba to this variable
    qDebug() << test1Byte.toHex(); //Print that 1 Byte in hex format
}

相关问题