Название: QSerialPort Отправлено: lks от Февраль 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(); . . . Название: Re: QSerialPort Отправлено: crazymonkey от Февраль 03, 2016, 19:41 Не наблюдаю проблем с этими функциями. Показывайте весь код.
Название: Re: QSerialPort Отправлено: torwig от Февраль 03, 2016, 20:44 А Вы не гадайте, где выходит. Допишите внутри каждого if вывод в qDebug() сообщения мол "Отправилось"/"Пришли данные", и аналогично можно в ветвях else.
Исключительно для теста можно перевести код в асинхронный режим и проверить, испускается ли сигнал readyRead, чтобы наверняка знать, приходят данные или нет. Это, так сказать, действия в случаях проявления магии "оно должно работать, но не работает" :) Название: Re: QSerialPort Отправлено: lks от Февраль 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 ? Название: Re: QSerialPort Отправлено: kuzulis от Февраль 09, 2016, 12:44 Цитировать Оказывается не всегда очищает за собой. Как прокомментирует разработчик QSerialPorta ? Кратко: не верю! Название: Re: QSerialPort Отправлено: Bepec от Февраль 09, 2016, 14:28 +1 к не верю.
PS думается ответ вы найдете сниффером, а не обвинением QSerialPort'а. Название: Re: QSerialPort Отправлено: lks от Февраль 11, 2016, 05:36 Да, Вы правы. Да и я не верил (поторопился с вопросом).
Проверил в асинхронном режиме, причина была в устройстве, с которым общался. После операции "запрос-ответ" оно выдавало с некоторой задержкой пару-тройку копий последнего ответа, не разделенных по-времени. Ввиду того, что режим был синхронный изменение таймаутов (между пакетами и между байтами в пакетах) меняло картину. При очистке буферов эти старые пакеты удаляются и не влияют на результат. Спасибо за поддержку! |