Коллеги,
имеется система мониторинга оборудования. Среди этого оборудования есть устройство (бункерные весы), которое через интерфейс 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-й картинке.
Такое ощущение, что в буфере порта накапливаются данные и я их не все считываю. Но ведь буфер порта очищается после получения каждого кадра данных.
В чем может быть проблема такого отставания данных, получаемых по шине от устройства?