Название: Qextserialport и waitForReadyRead Отправлено: em от Июнь 16, 2008, 16:27 Всех приветствую!
Для работы с COM-портом использую QextSerialPort v1.1, после передачи данных в порт, ожидаю ответа, при помощи ф-ии Цитировать bool waitForReadyRead(int msec) Код: if (port->waitForReadyRead(1000)) { подскажите что не так? Название: Re: Qextserialport и waitForReadyRead Отправлено: em от Июнь 16, 2008, 17:44 попытался сделать типа waitReadyRead(1000);
но почемуто не испускается сигнал readyRead(); делал так Код: connect(port, SIGNAL(readyRead()), this, SLOT(setReady())); Название: Re: Qextserialport и waitForReadyRead Отправлено: Mikhail от Июнь 16, 2008, 21:43 Всех приветствую! Для работы с COM-портом использую QextSerialPort v1.1, после передачи данных в порт, ожидаю ответа, при помощи ф-ии Цитировать bool waitForReadyRead(int msec) Код: if (port->waitForReadyRead(1000)) { подскажите что не так? Используй port->bytesAvailable() для проверки данных в буфере порта. Для приема желательно организовать отдельный поток в котором в функции run() и делать эту проверку в цикле. Название: Re: Qextserialport и waitForReadyRead Отправлено: em от Июнь 17, 2008, 08:23 Используй port->bytesAvailable() для проверки данных в буфере порта. Работа с com портом у меня в отдельном потоке,Для приема желательно организовать отдельный поток в котором в функции run() и делать эту проверку в цикле. Ага кстати можно же делать проверку в цикле с таймоутом моленько по другому, типа Код: void Thread::waitReadyRead(int msec) Интересно почему сигнал readyRead() не испускается? Название: Re: Qextserialport и waitForReadyRead Отправлено: Mikhail от Июнь 17, 2008, 10:20 Используй port->bytesAvailable() для проверки данных в буфере порта. Работа с com портом у меня в отдельном потоке,Для приема желательно организовать отдельный поток в котором в функции run() и делать эту проверку в цикле. Ага кстати можно же делать проверку в цикле с таймоутом моленько по другому, типа Код: void Thread::waitReadyRead(int msec) Интересно почему сигнал readyRead() не испускается? void QIODevice::readyRead () [signal] This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device. readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true). Note for developers implementing classes derived from QIODevice: you should always emit readyRead() when new data has arrived (do not emit it only because there's data still to be read in your buffers). Do not emit readyRead() in other conditions. А в qextserialport этот сигнал не испускается, так как такова реализация qextserialport. Как написано в документации испускать этот сигнал должен класс производный от QIODevice. Название: Re: Qextserialport и waitForReadyRead Отправлено: em от Июнь 17, 2008, 10:35 Понятно,
to Mikhail Спасибо! Название: Re: Qextserialport и waitForReadyRead Отправлено: em от Июнь 21, 2008, 10:29 Ага кстати можно же делать проверку в цикле с таймоутом моленько по другому, типа оказалось что такая реализация работает не очень корректно, получается так, что например должно прийти сообщение 9 байт а при использовании этой функции получается что port->bytesAvailable() срабатывает и считывается 8 байт а другой байт считывается как второе сообщение в виде одного оставшегося байта.Код: void Thread::waitReadyRead(int msec) А вот если использовать просто msleep(int msec) засыпая допустим на 60 мс, то сообщение читается как одно все 9 байт. Порт в клиенте и севере открывается в режиме QIODevice::ReadWrite | QIODevice::Unbeffered по идее раз данные не буферизуются и то они отправляются все разом и должны приниматься тоже разом Есть идеи как можно это исправить? Название: Re: Qextserialport и waitForReadyRead Отправлено: Mikhail от Июнь 21, 2008, 11:01 Ага кстати можно же делать проверку в цикле с таймоутом моленько по другому, типа оказалось что такая реализация работает не очень корректно, получается так, что например должно прийти сообщение 9 байт а при использовании этой функции получается что port->bytesAvailable() срабатывает и считывается 8 байт а другой байт считывается как второе сообщение в виде одного оставшегося байта.Код: void Thread::waitReadyRead(int msec) А вот если использовать просто msleep(int msec) засыпая допустим на 60 мс, то сообщение читается как одно все 9 байт. Порт в клиенте и севере открывается в режиме QIODevice::ReadWrite | QIODevice::Unbeffered по идее раз данные не буферизуются и то они отправляются все разом и должны приниматься тоже разом Есть идеи как можно это исправить? Не надо ничего исправлять. Это может быть влиянием операционной системы. Она может заняться чем то другим. Смотрел передачу по линии и видел рваные пачки байт. Все время разные. Предлагаю вернуться к чтению port->bytesAvailable() в основном цикл функции run() потока. Не надо засыпать и ничего не пропустишь. Пример из рабочего проекта: Код: void qPThRead::run() Название: Re: Qextserialport и waitForReadyRead Отправлено: Hammer от Ноябрь 19, 2008, 20:11 А как прикрутить чтение в отдельном потоке к нижеследующему коду? Я хотел бы реализовать софтовый флоу контроль, т.е. отправляю пакет фиксированной длины и жду ответа от устройства, что оно его приняло и записало или таймаут и выход из процедуры отправки (ну или повторная отправка n раз). Тут лучше всего подходит метод waitForReadyRead(), но его надо писать самому, в чем я не силен пока что. буду благодарен за любую помощь, включая готовые куски кода =)
Код
|