Название: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 02, 2011, 11:25 Здравствуйте. Проблемка такая...принимаю по ком-порту 6 байт данных раз в 4 сек. Если использую режим ReadOnly или AbstractSerial::ReadOnly| AbstractSerial::Unbuffered посылка приходит частями, те:
Код: Bytes_Available: 3 или Код: Bytes_Available: 2 Любые игры с "setCharIntervalTimeout(10)" не помогают... Почему сообщение разделяется на куски? Код: MyMainWindow::MyMainWindow(QWidget *parent) : Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 02, 2011, 13:22 Цитировать Любые игры с "setCharIntervalTimeout(10)" не помогают... Потому, что надо играться с setTotalReadConstantTimeout(), а про setCharIntervalTimeout() нужно забыть. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 02, 2011, 13:48 Тоже не помогает...
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 02, 2011, 14:17 Какую версию библиотеки используете и какая ОС?
Код
А вообще, пора уже переходить на новье - ветку 2.0. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 02, 2011, 14:23 Там где 2 библ qserialdevice и qserialdeviceenumerator . Вторую не крепил, не критично? Где посмотреть версию? ОС: Windows XP
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 02, 2011, 14:26 Цитировать Где посмотреть версию? тут (https://gitorious.org/qserialdevice/qserialdevice/trees/master), справа внизу будут все доступные версии. Если используете ту ветку что сейчас - то качайте master бранч, если хотите самое новье - то 2.0 бранч. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 02, 2011, 14:32 ну судя по всему у меня и так мастер бранч...
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 02, 2011, 14:34 Значит напиши побольше в
Код
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 02, 2011, 14:44 Да ощущение, что ему все равно...(( сколько не поставить..может я не так подцепляю библиотеку...
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 02, 2011, 15:10 Ну тогда - ХЗ, проверяй в отладчике.
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 05, 2011, 12:13 С новой библиотекой 2.0 другой момент. Все вроде принимает "Bytes_Available: 6 ", но не генерирует сигнал "readyRead()" и не уходит в обработку слота. В чем может быть причина?
Код: MyMainWindow::MyMainWindow(QWidget *parent) : Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 05, 2011, 12:33 Потому, что connect делаешь после того, как отработает waitForReadyRead(), т.е. после того как сигнал уже излучился.
В винде такая есть особенность, что readyRead() срабатывает однажды при приеме символа. И если заранее не сделать connect - то никакого сигнала не получишь. Поэтому нужно делать connect сразу после создания объекта порта. И непонятно зачем вообще использовал waitForReadyRead() + connect - это хрень собачья. Почитай документацию Qt в плане того, в каких случаях необходимо использовать waitForReadyRead(). Так же в 2.0 не используй. Код
С версией 2.0 идут примеры /test/guiapp - вот там и проверь принимаются или нет твои 6 байт. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 05, 2011, 14:58 Спасибо за помошь. Убрал waitForReadyRead, снова делит пакет пополам...есть какой то аналог setTotalReadConstantTimeout() в этой библиотеке, не могу найти..ну или как выставить этот таймаут, чтоб пакет целиком прочелся...или же хотя бы читался по байту...ну не догоняю..
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 05, 2011, 15:41 Цитировать есть какой то аналог setTotalReadConstantTimeout() в этой библиотеке Нету. Он и не нужен. В этой новой версии чтение происходит "мгновенно", без всяких таймаутов, т.е. не блокирующий режим. Поэтому, при приеме сигнала readyRead() запускай QTimer::singleShot() с таймаутом, при котором гарантированно придет весь твой пакет. Коннекть этот singleShot() на слот чтения данных и читай. Т.е. singleShot() сработает с некоторой задержкой от момента первого поступления данных. Вот тебе обсуждение: http://www.prog.org.ru/index.php?topic=9537.msg133030#msg133030 см. от поста №618 и ниже. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: BRE от Декабря 05, 2011, 15:58 Я вообще не могу понять в чем собственно проблема. :)
Пришел сигнал readyRead, проверил сколько байт доступно (bytesAvailable), если меньше требуемых 6, то просто выходим из слота и ждем пока приедет остальная часть пакета (снова вызовется readyRead). Это абсолютно нормальный порядок работы при получении удаленных данных. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 06, 2011, 13:30 Ваши б слова, да пораньше)) Ну в итоге я так и сделал
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 06, 2011, 14:30 А по какой причине может резаться старший бит в байте? вместо FF (255) приходит 127. В настройках 8 бит данных стоит, как должно быть
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 06, 2011, 14:40 Проверь Free-Serial Port Monitor (http://www.serial-port-monitor.com/)- ом. Он покажет что конкретно отправляется и принимается.
И если касячит библиотека - будем исправлять. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 06, 2011, 14:49 проверяю терминалом.(Terminal). На него приходит все как надо. Сейчас попробую вашей прогой. Но со старой библиотекой такая же песня, сейчас посмотрел... Какие еще есть варианты?
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 06, 2011, 14:53 Паритет, стоп биты, скорость, контроль потока.
Больше никаких вариантов нет. :) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 06, 2011, 16:06 Все, нашлось...нормально все принималось, выводил неправильно походу)
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 09, 2011, 08:07 Еще вопрос: есть ли возможность вызывать слот при поступлении одного байта в КОМ? Чтобы отслеживать идентификатор начала пакета? На данный момент при вызове слота доступен не один байт, а несколько...Среди них искать идентификатор не очень удобно.
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 09, 2011, 09:42 Оно и так срабатывает при появлении первого байта.
Просто пока идет обработка - набегают еще байты. Для того чтобы узнать что за значения буфере, не читая его - используй метод peek(). (это что-то типа read() - только при peek(), при чтении, данные из буфера не будут удаляться.) Но это в случае если не использовал Unbuffered и, наверное только для версии 2.0, хотя насчет версии могу ошибаться. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 09, 2011, 14:03 то есть чтобы искать идентифик начала пакета мне делать:
Код: ba = peak(myPortCom->bytesAvailable()); и потом в буфере ba искать этот индентификатор? по одному байту никак не анализируется? Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Декабря 09, 2011, 14:39 Цитировать и потом в буфере ba искать этот индентификатор? по одному байту никак не анализируется? зачем ba? вот по одному: Код
Хотя, можно было бы для перемещения по буферу использовать seek(), но он не работает для sequential устройств. Поэтому, ИМХО, только peek() с целым массивом или же делай Код или Код по одному байту пока не найдешь начало своей метки (или что-там у тебя). Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Декабря 09, 2011, 14:49 Благодарю!
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 27, 2012, 12:46 Добрый день! Возникла такая проблема: прога должна по нажатию кнопки отправлять номер устройства через ком-порт. Устройство по получении этой посылки отправляет ее обратно на ПК, вот в момент прихода этой посылки на ПК прога грузит проц почти на 100%. Если из функции убрать readAll, то все Ок, а если производить чтение пришедших байт, то такая байда...Закрытие проги не удаляет ее из процессов, приходится вручную удалять. Что может быть не так?
Код: MyMainWindow::MyMainWindow(QWidget *parent) : Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 27, 2012, 14:20 Не знаю. Проблем быть не должно.
Попробуй тоже самое сделать (послать/принять) с использованием /test/guiapp (или как там его). Будет ли там такое же поведение? И какая ОС? Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 27, 2012, 16:08 Не знаю. Проблем быть не должно. Попробуй тоже самое сделать (послать/принять) с использованием /test/guiapp (или как там его). Будет ли там такое же поведение? И какая ОС? Я уже запутался кстати, библиотека QSerialPort новее SerialDevice-а? ОС Win XP. Не могу найти пока этот пример. Что странно: прийти должно 10 байт, если функция readAll() присутствует, то приходят по частям, но не все 10 байт. А если функцию закомментить, то byteAvaliable показывает, что все 10 байт пришли.(так же по частям) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 27, 2012, 17:26 Цитировать Я уже запутался кстати, библиотека QSerialPort новее SerialDevice-а? Почитай тут http://qt-project.org/wiki/QtSerialPort_RussianSerialDevice (ветка 2.0) самая новая и последняя версия (вообще), далее вместо неё будет QtSerialPort. Цитировать Не могу найти пока этот пример http://gitorious.org/qserialdevice/qserialdevice/trees/2.0/tests/guiappЦитировать Что странно: прийти должно 10 байт, если функция readAll() присутствует, то приходят по частям, но не все 10 байт. А если функцию закомментить, то byteAvaliable показывает, что все 10 байт пришли.(так же по частям) Это не странно. Так и должно работать (по частям) в не зависимости от того присутствует ли какие нить функции или нет. :)Вот тут пример как целиком прочитать https://qt-project.org/forums/viewreply/71427/ Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 28, 2012, 08:04 Нет, странно не то, что по частям, а то, что полностью не доходит пакет, если добавить функцию чтения readAll().
Попробовал прогой guiapp. Тупо шлю ей посылки в 10байт. Если слать с интервалом в 4 сек, то приложение Гуиапп грузит проц на 99 % периодически, если слать быстрее с интервалом в 20мс, то максимум на 78 %. Это нормально? Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 28, 2012, 09:46 Цитировать Это нормально? А я и сам не знаю. Надо тестировать и т.п. В QSerialDevice 2.0 не очень хорошо реализована подсистема I/O, планирую ее подрихтовать в QtSerialPort. Но сейчас на это пока нет времени. На крайняк используй то что есть, или QextSerialPort от Debao (имя китайца, который тоже немного подрихтовал QextSerialPort ). Там, на гуглокоде найдешь. :) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 28, 2012, 10:18 Попробовал тестовую прогу "uartassistant" на QextSerial... не более 10% грузит...
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 28, 2012, 16:48 Вроде разобрался в чем было дело.
Касяк появляется всегда просто после закрытия порта (например просто открыли, а потом закрыли). После закрытия загрузка CPU растет до 33%. Для временного решения необходимо в serialportengine_win.cpp в конструкторе WinSerialPortEngine написать: Код
Но при этом, не будут работать политики (да они в принципе и не нужны для обычного использования). После этого у меня все работает с загрузкой CPU = 0% :) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 29, 2012, 08:44 У меня есть только файл "serialportengine_p_win.cpp" . Имелся ввиду он?
Вот конструктор, добавил. m_currentMask(0) там было до меня. А m_desiredMask(0), где объявлена? не находит... Код: WinSerialPortEngine::WinSerialPortEngine(SerialPortPrivate *parent) И еще, загрузка проца у меня происходит не только при закрытии...а и при приеме.. Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 29, 2012, 09:53 Цитировать Имелся ввиду он? ДаЦитировать А m_desiredMask(0), где объявлена? Упс, я уже в QtSerialPort поменял названия переменных.В QSerialDevice эта переменная называется m_setMask и нужно писать Код
Цитировать И еще, загрузка проца у меня происходит не только при закрытии...а и при приеме.. Ну, может быть все по той же причине. Попробуй исправь как я предлагаю, и посмотри что получится :)UPD: Хотя я проверял на Qt5 для QtSerialPort . Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 29, 2012, 10:01 Нашел какой момент грузит так сильно проц, у меня посылка не доходит целиком. То есть пришла часть, делаешь запрос второй посылки, приходит оставшаяся (от предыдущей) и новая... Попробовал сделать через QTimer. В таком случае все отлично, проц не грузится совсем, но подскажите, как убрать вот это:
Код: void MyMainWindow::receiveLetter() В дебаге: Код: Bytes_Available: 10 ПС. изменения в конструкторе похоже ни к чему не привели Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 29, 2012, 10:16 Цитировать те, чтобы заходил в :receiveLetter() один раз, а не 10. Пробовал флаг выставлять..не помогло что-то.. Я тебе выше дал ссылку где показано как принимать данные. Цитировать ПС. изменения в конструкторе похоже ни к чему не привели Ну неправда же :)Название: Re: Трудность с библиотекой QSerialDevice Отправлено: Piknik от Марта 29, 2012, 10:29 Пример нашел кажись) Кстати , пробовал менять readAll() на read(num), в таком случае все данные одной посылки приходят только в ней...но как и прежде в ждущем режиме(т.е. когда ничего не шлется-не принимается) загрузка почти 99% и прога из процессов только вручную удаляется. Странно, хотелось с этим разобраться...но похоже придется через таймер делать..
Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 29, 2012, 10:39 У меня ничего не грузится на 90% без таймеров и пр...
везде 0% Win7 x64, Qt5, QtSerialPort :) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: bekor от Марта 29, 2012, 10:57 У меня такая проблема с этой библиотекой
программа посылает запрос на устройство через RS232 а устройство отвечает пакетом данный 15-20 байт. Устройство это принимает все пакеты нормально но port1.read(port1.bytesAvailable()); иногда (точнее очень часто, скажем 35 пакетов из 100 не принимаются) не читает ответный пакет и данные часто теряются (устройство 100 процентно отвечает проверено) Код: dn=ui->PortSelect->currentText(); Код: if(port1.waitForReadyRead(25)) Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 29, 2012, 11:12 2 bekor,
1. используй версию 2.0. http://qt-apps.org/content/show.php/QSerialDevice?content=112039 2. не используй waitForReadyRead(), используй сигналы. 3. как принимать данные я дал ссылку выше! >:( Название: Re: Трудность с библиотекой QSerialDevice Отправлено: bekor от Марта 29, 2012, 15:16 перешел на версию 2.0
в место waitForReadyRead() сделал так Код: connect(&port1,SIGNAL(readyRead()),this,SLOT(checkAvailable())); порт просто напросто не принимает пакеты иногда, вот сканировал комуникацию прогой Advanced Serial Port Monitor желтые поля запрос от qt приложения а белые поля ответ от ведомого устройства. там хорошо видно что после 7-мого запроса не принят ответный пакет и дак далее Название: Re: Трудность с библиотекой QSerialDevice Отправлено: kuzulis от Марта 29, 2012, 15:56 Вообще-то это твое у-во после 7-го запроса не ответило, а не библиотека не приняла ответ!
Если бы у-во ответило, то оно отправило бы по-любому пакет данных в приемный буфер драйвера порта и по-любому Advanced Serial Port Monitor показал бы тебе эти данные. Но раз данных от у-ва нет - то их и не было! Название: Re: Трудность с библиотекой QSerialDevice Отправлено: bekor от Марта 29, 2012, 18:30 Проблема решена :)
причина была в переходнике USB->RS232, китайский дешевый кабель косячил, поменял на более качественный переходник и теперь ни один запрос не остается без ответа. Библиотека версии 2.0 однозначно работает лучше чем прежние версии ! Спасибо !!!!! |