Russian Qt Forum
Ноябрь 13, 2019, 16:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прослушивание последовательного порта [Решено]  (Прочитано 182 раз)
sergek
Хакер
*****
Offline Offline

Сообщений: 631


Мы должны приносить пользу людям!


Просмотр профиля
« : Сентябрь 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-й картинке.

Такое ощущение, что в буфере порта накапливаются данные и я их не все считываю. Но ведь буфер порта очищается после получения каждого кадра данных.
В чем может быть проблема такого отставания данных, получаемых по шине от устройства?
« Последнее редактирование: Сентябрь 10, 2019, 11:09 от sergek » Записан

Qt 5.13.0 Qt Creator 4.10.2
Win7, Win10, Ubuntu 18.04
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4173



Просмотр профиля
« Ответ #1 : Сентябрь 10, 2019, 11:06 »

Потому, что вы вычитываете данные по несколько пакетов измерения, а обрабатываете только первый. Потом вы вычитываете еще несколько, а обрабатываете всего один - первый очередной.
Проверьте это выводя в лог размер буфера  responseBuffer, он будет постоянно расти.

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

Сообщений: 631


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #2 : Сентябрь 10, 2019, 11:07 »

Супер. Спасибо!
Записан

Qt 5.13.0 Qt Creator 4.10.2
Win7, Win10, Ubuntu 18.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 22.