Как я могу перебирать байты в QByteArray индивидуально? - PullRequest
1 голос
/ 06 апреля 2020

У меня есть собственный сигнальный слот в 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 (), и большую часть времени эта функция слота (serialReceived ()) вызывается достаточно часто, так что за один раз принимается только 1 символ, поэтому Я могу проверить букву, обозначающую датчик, затем при следующем вызове функции я могу проверить крайний левый номер данных датчика и т. Д. c, пока не достигну 4-го числа и затем байта остановки, прежде чем процесс будет повторен.

Проблема в том, что иногда он получает больше байта за раз, поэтому, если в моей базе данных содержится более одного значения, я не знаю, как можно было бы проверить наличие отдельных полученных байтов (например, : я получил письмо, за которым следуют 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;
    }
    }

В общем, моя проблема в том, как я могу читать по 1 байту за раз из QserialPort, чтобы эта проблема больше не возникала? Я также не уверен, является ли мой метод получения символов очень эффективным. Спасибо!

...