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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSerialPort  (Прочитано 5670 раз)
lks
Новичок

Offline Offline

Сообщений: 19


Просмотр профиля
« : Февраль 03, 2016, 08:42 »

Пытаюсь обмениваться синхронно с com-портом по примеру из Qt blockingmaster.
Такое впечатление. что waitForBytesWritten не работает (выходит по таймауту).
Читал, что раньше были проблемы с этими функциями. Как сейчас обстоят дела ?

if (serial.waitForBytesWritten(Timeout)) {
   if (serial.waitForReadyRead(Timeout)) {
      Data = serial.readAll();
      while (serial.waitForReadyRead(10)) Data += serial.readAll();
 . . .
Записан
crazymonkey
Гость
« Ответ #1 : Февраль 03, 2016, 19:41 »

Не наблюдаю проблем с этими функциями. Показывайте весь код.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Февраль 03, 2016, 20:44 »

А Вы не гадайте, где выходит. Допишите внутри каждого if вывод в qDebug() сообщения мол "Отправилось"/"Пришли данные", и аналогично можно в ветвях else.
Исключительно для теста можно перевести код в асинхронный режим и проверить, испускается ли сигнал readyRead, чтобы наверняка знать, приходят данные или нет.
Это, так сказать, действия в случаях проявления магии "оно должно работать, но не работает"  Улыбающийся
Записан
lks
Новичок

Offline Offline

Сообщений: 19


Просмотр профиля
« Ответ #3 : Февраль 09, 2016, 08:06 »

Вопрос решился. Да, Эти функции работают нормально. Проблема была в другом. Не буду описывать этапы решения, но отмечу главный вывод. Думаю, многим пригодится. Повторю, работал с портом синхронно. При получении ответа из порта, часто приходили лишние пакеты (скорее, оставшиеся от предыдущих посылок) и даже не в одном экземпляре. Решилось очисткой буферов перед записью в порт.
    serial->clear(QSerialPort::AllDirections); // без этого работает некорректно.
    serial->write(outData);
    if (serialMei->waitForReadyRead(timeout)) {
        inData = serial->readAll(); while (serial->waitForReadyRead(20)) inData += serial->readAll();
    } else // Read TimeOut
Читал, что readAll() всё выбирает. Оказывается не всегда очищает за собой.
Как прокомментирует разработчик QSerialPorta ?
« Последнее редактирование: Февраль 09, 2016, 09:22 от lks » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Февраль 09, 2016, 12:44 »

Цитировать
Оказывается не всегда очищает за собой. Как прокомментирует разработчик QSerialPorta ?

Кратко: не верю!

Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #5 : Февраль 09, 2016, 14:28 »

+1 к не верю.

PS думается ответ вы найдете сниффером, а не обвинением QSerialPort'а.
Записан
lks
Новичок

Offline Offline

Сообщений: 19


Просмотр профиля
« Ответ #6 : Февраль 11, 2016, 05:36 »

Да, Вы правы. Да и я не верил (поторопился с вопросом).
Проверил в асинхронном режиме, причина была в устройстве, с которым общался.
После операции "запрос-ответ" оно выдавало с некоторой задержкой пару-тройку копий последнего ответа, не разделенных по-времени.
Ввиду того, что режим был синхронный изменение таймаутов (между пакетами и между байтами в пакетах) меняло картину.
При очистке буферов эти старые пакеты удаляются и не влияют на результат.
Спасибо за поддержку!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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