Название: Работа с qextserialport Отправлено: Alex2006 от Январь 17, 2007, 23:25 Народ помогите. Начал делать прогу для работы с rs232? нашёл библиотеку qextserialport, но не понимаю как сделать независимо и одновременно чтение и запись. Если кто работал, скинте пример на alex200206@list.ru. Буду премного благодарен.
Название: Работа с qextserialport Отправлено: nova от Январь 17, 2007, 23:43 Мне он (qextserialport) чет не понравился.
Поентому наваял свой клас. Функционал как у QFile тока для кома. Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) . Если надо могу поделится ;) Название: Работа с qextserialport Отправлено: Racheengel от Январь 18, 2007, 01:56 www.ii-system.com, там прога InSense, которая юзает qextserialport, в исходниках. качай, смотри
Название: Работа с qextserialport Отправлено: Alex03 от Январь 18, 2007, 10:42 Под линухом с использованием QSocketNotifier можно забубенить, чтоб только сигналы приходили типа - "доступны новые данные", "записанные данные переданы".
Название: Работа с qextserialport Отправлено: sector от Январь 18, 2007, 11:56 Народ зачем так извращатся!!! :( Можно сделать просто виртуальные функции и разбить на win и linux... там все просто только надо условия препроцессора норимально прописать!!! и собственно 2 функции перегрузить!!!
Название: Работа с qextserialport Отправлено: Alex03 от Январь 18, 2007, 12:18 Разница в блокирующем и неблокирующем вводе/выводе, а в случае неблокирующего в работе по опросу или по "сигналам" от ядра (драйверов).
Название: Работа с qextserialport Отправлено: Alex2006 от Январь 18, 2007, 21:00 Спасибо за ответы, если не сложно кинь на мыло посмотреть.
Название: Работа с qextserialport Отправлено: Alex03 от Январь 19, 2007, 08:14 Цитата: "Alex2006" Спасибо за ответы, если не сложно кинь на мыло посмотреть. Если это мне, то кто сказал что оно у меня есть? :) QSocketNotifier пользовал под линуксом для ловли событий от файлового дискриптора драйвера некоего девайса. Название: Работа с qextserialport Отправлено: nova от Январь 19, 2007, 11:12 А если ко мне, то отправил на почту :)
Использовал именно QSocketNotifier для readyRead. для записи не делал за ненадобностью. там правда делать нечего ;) Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) ) Название: Работа с qextserialport Отправлено: Alex03 от Январь 19, 2007, 12:27 Цитата: "nova" Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) ) А вот отсюда поподробней. На мой текущий взгляд QSocketNotifier под виндой только для сокетов, и больше ни в чём не поможет. :( Буду очень рад если ошибаюсь! Просвятите плиз. :) Т.е. если в линуксе всё взаимодействие между юзерспейсом и файлами/сокетами/драйверами идёт через файловые дискрипторы (собственно всё отражается как файлы), то и механизм получения/ожидания событий от ядроспейса возможен через сисвызовы select()/poll(). Плюс соответствующий драйвер должен поддерживать poll. Поэтому в линуксе QSocketNotifier просто засовывает свой файловый дискриптор в массив (в котором ещё и прочие стдин-ы/стдауты, иксовые какиенить пайпы или теже сокеты и т.д.), а в глубине евентлупа qt передаёт этот массив в select()/poll(). В винде же источников событий выраженных в виде системных объектов туева хуча, которую всё же можно свесли воедино в какойнить MsgWaitForMultipleObjectХХХ вот только массив там из HANDLE. В общем, по крайней мере в qt3.3.6, fd от QSocketNotifier передаётся в WSAAsyncSelect(), т.е. обрабатывается именно как Цитировать SOCKET s [in] A descriptor that identifies the socket for which event notification is required и передать туда fd COM порта не есть гуд. :( Название: Работа с qextserialport Отправлено: mcgeenerman от Январь 19, 2007, 15:24 Я юзал данный набор классов. У меня получилось под линуксом, под винду не могу утверждать что работает, но теоретически должно. Пользовался qt3(mandriva linux). Инициализация нармально. Запись в ком writeBlock(...) прошла сразу. C чтением пришлось повозиться. Решение примерно такое:
ожидаеш байты Posix_QextSerialPort::bytesWaiting(1000), читаеш один байт readBlock(...), повторение до тех пор пока(условие). Скинул бы код но он на работе. Название: Работа с qextserialport Отправлено: nova от Январь 19, 2007, 16:01 Цитата: "Alex03" Цитата: "nova" Под винду могу попробовать дописать ( правда чисто теоретически. Проверять негде :) ) А вот отсюда поподробней. На мой текущий взгляд QSocketNotifier под виндой только для сокетов, и больше ни в чём не поможет. :( Буду очень рад если ошибаюсь! Просвятите плиз. :) Т.е. если в линуксе всё взаимодействие между юзерспейсом и файлами/сокетами/драйверами идёт через файловые дискрипторы (собственно всё отражается как файлы), то и механизм получения/ожидания событий от ядроспейса возможен через сисвызовы select()/poll(). Плюс соответствующий драйвер должен поддерживать poll. Поэтому в линуксе QSocketNotifier просто засовывает свой файловый дискриптор в массив (в котором ещё и прочие стдин-ы/стдауты, иксовые какиенить пайпы или теже сокеты и т.д.), а в глубине евентлупа qt передаёт этот массив в select()/poll(). В винде же источников событий выраженных в виде системных объектов туева хуча, которую всё же можно свесли воедино в какойнить MsgWaitForMultipleObjectХХХ вот только массив там из HANDLE. В общем, по крайней мере в qt3.3.6, fd от QSocketNotifier передаётся в WSAAsyncSelect(), т.е. обрабатывается именно как Цитировать SOCKET s [in] A descriptor that identifies the socket for which event notification is required и передать туда fd COM порта не есть гуд. :( Вы абсолютно прваы нащет HANDLE. Мало того он понадобится и для управления линиями порта, и для установок порта ( скорость, четность ... ). Однако есть системный вызов HANDLE hFile = (HANDLE) _get_osfhandle(fd); которым можно получить HANDLE и пользовотся ао всех перечисленных случаях. Все чтоя сказал, чисто теоретические умозаключения. На данный момент проверять негде, да и некогда ;) И вобще, все это в вениках серез такую задницу делается :) Название: Работа с qextserialport Отправлено: izoomer от Январь 19, 2007, 19:52 Цитата: "nova" Мне он (qextserialport) чет не понравился. Поентому наваял свой клас. Функционал как у QFile тока для кома. Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) . Если надо могу поделится ;) а можно и мне, мне как раз под линух нужно Название: Работа с qextserialport Отправлено: nova от Январь 19, 2007, 23:13 Цитата: "izoomer" Цитата: "nova" Мне он (qextserialport) чет не понравился. Поентому наваял свой клас. Функционал как у QFile тока для кома. Работает под линухом на ура, под веники пока не переделывал, но может и прийдется. в принципе там не много доделывать, но веников нет :) . Если надо могу поделится ;) а можно и мне, мне как раз под линух нужно Можно, но куда? К стати а может в форум выложить? Токо я не нашел как :) Название: Работа с qextserialport Отправлено: mcgeenerman от Январь 24, 2007, 19:57 а вот работающий код в линуксе
Код: int ComPort::init(unsigned int comport,int boud_rate) Название: Работа с qextserialport Отправлено: nova от Январь 24, 2007, 20:25 А я и не сомневаюсь что он рабочий.
Но возникает вопрос как енто все прикрутить к гуйной морде? С передачей все ясно. Но вот с приемом ??? Особенно если про задачу известно что устройство висящее на порту асинхронное. и данные с него могут появлятся в моменты времени зависящее от положения планет солнечной системы и от положения молекул воды находящихся в 5 кубах расоложеных на дне озера лохнес :) :) Название: Работа с qextserialport Отправлено: Racheengel от Январь 24, 2007, 23:55 Мы делали так - висит thread, в котором каждые 100мс проверяется на наличие новых данных в порту. Если это так, все читается и передается евентами в гуевый thread. Работало нормально.
Название: Работа с qextserialport Отправлено: nova от Январь 25, 2007, 18:02 А меню было проще написать свой класс подглядывая в qextserialport чтобы в нем нормально отрабатывл readyRead() сигнал. Под линухом все прекрасно паботает.
|