Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lks от Февраль 03, 2016, 08:42



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