Чтение непрерывных данных из последовательного порта с использованием QT C ++ - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в QT C ++ и пытаюсь написать программу, которая могла бы непрерывно читать данные из последовательного порта. Моя программа иногда работает плавно, но иногда считывает неверные данные. Я запустил отладку и вот что у меня получилось:

"61\x00\x00"
"61\x00\x00"
"61\x00\x00"
"62\x00\x00"
"62\x00\x00"
"62\x00\x00"
"62\x00\x00"
"63\x00\x00"
"63\x00\x00"
"5"
"3\x00\x00"
"5"
"2\x00\x00"
"5"
"2\x00\x00"

"54\x00\x00"
"54\x00\x00"
"54\x00\x00"
"55\x00\x00"
"54\x00\x00"
"54\x00\x00"
"55\x00\x00"
"55\x00\x00"
"5"
"1\x00\x00"
"51"
"\x00\x00"
"5"
"2\x00\x00"
"5"
"1\x00\x00"
"5"
"1\x00\x00"

Каким-то образом QTSerialPort не прочитал все данные. А вот мой код, в котором данные должны читаться и отображаться.

   if(serial->isOpen() && serial->isReadable()){
       QByteArray receivedData;
       receivedData = serial->readAll();
       qDebug()<<receivedData;
       ui->lcdDistance->display(receivedData.toInt());
    }else{
       QMessageBox::critical(this, tr("Error"), tr("Doesn't receive data"));
    }

Я думаю, проблема возникла из QT, а не из микроконтроллера, потому что я также запускаю отладку с помощью своего микроконтроллера, и он работал очень хорошо.

Вот код в моем u C STM32

    while (1) {
    HAL_UART_Receive(&huart2, rxData, 1, 1000);

    if (rxData[0] == '1') { //RUN
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, SET);

        lcd_clear();
        lcd_put_cur(0, 0);
        lcd_send_string("LOADING...");

        HAL_Delay(1000);

        lcd_clear();

        int i = 40;

        //HAL_Delay(1000);

        while (i < 100) {
            htim2.Instance->CCR1 = i;
            sensor_time = hcsr04_read();
            distance = sensor_time * .034 / 2;

            sprintf(str_distance,"%lu", distance);

            lcd_clear();
            lcd_put_cur(1, 0);
            lcd_send_string(str_distance);

            sendDistanceStatus = HAL_UART_Transmit(&huart2, str_distance, sizeof(str_distance),
                    100);
            if (sendDistanceStatus == HAL_OK) {
                i++;
                HAL_Delay(300);
            }
        }

        HAL_Delay(1000);
    } else { //STOP
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, RESET);
        lcd_clear();
        lcd_put_cur(0, 0);
        lcd_send_string("STOP...");
    }

}

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

1 Ответ

0 голосов
/ 06 мая 2020

Проблема заключается в синхронизации информации, поскольку она не может быть обнаружена, когда информация начинается и заканчивается. Простое решение - использовать такой символ, как конечная строка (\n):

sprintf(str_distance,"%lu\n", distance);
if(serial->isOpen() && serial->isReadable()){
    while(serial->canReadLine()){
        QByteArray ba = serial->readLine();
        ba = ba.replace('\0', QByteArray());
        qDebug() << ba;
        ui->lcdDistance->display(ba.toInt());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...