Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: sergek от Сентябрь 10, 2019, 10:54



Название: Прослушивание последовательного порта [Решено]
Отправлено: sergek от Сентябрь 10, 2019, 10:54
Коллеги,
имеется система мониторинга оборудования. Среди этого оборудования есть устройство (бункерные весы), которое через интерфейс RS-485 циклически (с периодом 100 мс) выдает по своему протоколу обмена данные (например, остаток корма в бункере). Я же подключаюсь через последовательный порт к шине и считываю эти данные. Подключение к порту постоянное, т.е. открыл один раз порт и больше не закрываю, слушаю. Протокол обмена двоичный, данные организованы в виде кадров, т.е. есть начало, конец и CRC.
Считывание данных из порта - асинхронное, по readyRead, примерно так:
Код
C++ (Qt)
   m_serialPort = new QSerialPort(this);
   QObject::connect(m_serialPort, &QSerialPort::readyRead, this, [this]() {
       responseBuffer += m_serialPort->read(m_serialPort->bytesAvailable());
 
       int begin = responseBuffer.indexOf(beginFrame);
       int end   = responseBuffer.indexOf(endFrame, begin);
 
       if ((begin < 0) || (end < 0)) {
           return;
       }
 
       QByteArray response = responseBuffer.mid(begin, end-begin+endFrame.size());
       responseBuffer.remove(0, end+endFrame.size());
...
       m_serialPort->clear(QSerialPort::AllDirections);
...
 
Теперь вопрос. Через некоторое время работы системы стал замечать, что показания весов, которые я считываю из порта, отстают от действительных значений, и это отставание приличное (от 5 до 10 минут). Это отставание я фиксирую по другим каналам (весы общаются с другой автоматикой, с которой я тоже получаю данные). Например, это можно видеть на 1-й картинке.

Но если последовательный порт, через который я читаю данные, переоткрыть (я просто перезапускаю сервис получения данных), то данные синхронизируются. Это видно на 2-й картинке.

Такое ощущение, что в буфере порта накапливаются данные и я их не все считываю. Но ведь буфер порта очищается после получения каждого кадра данных.
В чем может быть проблема такого отставания данных, получаемых по шине от устройства?


Название: Re: Прослушивание последовательного порта
Отправлено: Old от Сентябрь 10, 2019, 11:06
Потому, что вы вычитываете данные по несколько пакетов измерения, а обрабатываете только первый. Потом вы вычитываете еще несколько, а обрабатываете всего один - первый очередной.
Проверьте это выводя в лог размер буфера  responseBuffer, он будет постоянно расти.

Организуйте цикл и разбирайте все принятые полные пакеты.


Название: Re: Прослушивание последовательного порта
Отправлено: sergek от Сентябрь 10, 2019, 11:07
Супер. Спасибо!