Название: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 11:02 Здравствуйте! Возникла проблема при использовании связки QSerialDevice2 + linux + tibbo virtual com port. Есть устройство, которое взаимодействует с компом через драйвер tibbo tcp/ip <> serial port. Драйвер порта на конечной машине установлен и функционирует. Открываю порт таким образом:
Код
затем записываю в него управляющую команду: Код В результате команда до устройства доходит, а его ответ до компа - нет, пробовал форсировать получение ответа не через ReadyRead(), а по кнопке после посылки команды - толку ноль. В randterm (терминал, написанный на питоне), команды принимаются и отправляются, при чем если сначала отправить данные через QSerialDevice2, закрыть порт, а затем открыть порт через randterm - последний принимает не полученный ответ от устройства. Очень бы хотелось иметь возможность не только посылать данные, но и получать... зыЖ писать в ветку разработки постеснялся :) Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 12:10 Порт сначала надо открыть, а потом конфигурить!
ЗЫ: Ну сколько уже можно то а? А проверить возвращаемые значения от setRate(), setDataBits() и т.п. не судьба? Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 12:40 Порт сначала надо открыть, а потом конфигурить! Да, тут я невнимательно поступил. Собственно есть уже работающий проект, использующий первую (нулевую?) версию Вашей библиотеки, там все в нужном порядке конфигурируется, и под Windows все прекрасно работает, понадобилось перевести этот проект под linux - скомпилировалось все с первого раза, приложение данные посылает, а принимать отказывается. Вот и решил попробовать v2.0, и в результате такой же результат :(ЗЫ: Ну сколько уже можно то а? А проверить возвращаемые значения от setRate(), setDataBits() и т.п. не судьба? Теперь проверяю, конфигурирую в нужном порядке (setPort, open, setDataBits, setRate, etc...), все так же отказывается принимать данные :( ЧЯДН? Под виндой работает. Грешил бы на драйвер, но ведь из других терминалов (собственно проверял только на randterm, так как он позволяет посылать пакеты в hex формате) работает. Так что приходится грешить на свои кривые руки :(Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 13:21 Хм... интересно.... Значит readyRead() не излучается?
А у тебя есть исходники драйвера tibbo tcp/ip ? Может быть, там select не реализован? Попробуй собрать отладочную версию и поставить брекпойнт в src/serialportengine_p_unix.cpp в методе Код
т.е. 1. брекпойнт на сам этот метод или qDebug() для проверки того, а вызывается ли вообще этот метод? 2. брекпойнт или qDebug() в секцию Код
для проверки того, а ловит ли m_readNotifier вообще эвент о приходе данных? Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 13:59 Цитировать Может быть, там select не реализован? Хотя, бегло глянув в исходники древней версии vspd-1.12-linux.tar.gzвидно, что оно вроде было реализовано: Код
Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 14:06 Добавил QDebug() в оба места.
До обоих выводов доходит, секция Код постоянно (более 100 вызовов в секунду) вызывается до закрытия приложения. Какие-то исходники к драйверу прилагаются, только я не уверен, что это то, что нужно. На всякий случай во вложении архив с драйвером. Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 14:12 Хм.. странно... Если вызвается - то должно быть все OK.
Если сам сигнал readyRead() излучается, то убери вообще Код
Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 14:34 собственно в функции bool SerialPortPrivate::canReadNotification()
Код
вылетает на этом. Если убрать вызов Код
Код возвращает 0. Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 14:50 Ну а залезь в readFromPort() и пройди шаг за шагом до UnixSerialPortEngine::read().
Что возвращает нативная функция read()? Цитировать Если убрать вызов Код C++ (Qt) serialPort->setReadBufferSize(1024); Код C++ (Qt) qDebug() << "readBuffer" << serialPort->readBufferSize(); возвращает 0. Не используй setReadBufferSize() вообще, без него пробуй Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 14:57 Он считает, что ему считывать нечего.
Код bytesToRead = 0. Повторюсь, сторонняя терминальная программа, подключаясь к данному порту считывает из буфера данные, не полученные QSerialDevice. Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 15:25 По ходу в драйвере что-то накосячено с обработкой ioctl(..., FIONREAD, ...) т.е.
bytesAvailable() возвращает хренотень (ноль). Код
Поэтому замени bytesAvailable() тупо на любое число, например на 256 Код
Цитировать Повторюсь, сторонняя терминальная программа, подключаясь к данному порту считывает из буфера данные, не полученные QSerialDevice. Я посмотрел исходники этой питоновской терминальной программки - она читает потому,что у нее в отдельном потоке крутится постоянно read() :o Так что вот так. Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: Kurles от Апрель 09, 2012, 15:45 Спасибо! Заработало. Буду писать тиббовцам :)
Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 09, 2012, 15:51 Ок.
Тогда я тоже самое фикшу в QtSerialPort (http://qt-project.org/wiki/QtSerialPort_Russian)(избавляюсь от bytesAvailable) раз с дровишками бывают такие проблемы... Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: b-s-a от Апрель 09, 2012, 22:04 Я бы на твоем месте сделал бы некий workaround. т.е. если данные через read поступают, а через ioctl(..., FIONREAD, ...) нет, то тогда включать обход (два флага: тест уже пройден/еще не пройден и ioctl работает/не работает). В противном случае не включать.
Название: Re: QSerialDevice2 + linux + tibbo virtual com port Отправлено: kuzulis от Апрель 10, 2012, 09:45 Нет, в этом нет необходимости, тут (в этом коде) FIONREAD вообще не нужен,
он только мешает. Я давно хотел его отсюда убрать (т.е. убрать bytesAvailable() ) и заменить на чтение чанками, т.к. раз canReadyRead() был вызван - значит что-то пришло в порт и это нужно вычитать. А сколько там пришло данных - не важно, нет необходимости вызывать bytesAvailable() для определения их кол-ва. Достаточно читать тупо кусками. Для увеличения производительности, можно читать кусками не по 256 байт, а по 100500 - чтобы за один проход все... Так что, не нужно тут ничего городить. |