QSerialDevice - Библиотека для работы с COM-портами |
Здравствуйте, гость ( Вход | Регистрация )
QSerialDevice - Библиотека для работы с COM-портами |
Гость_Гость_* |
3.3.2011, 17:13
Сообщение
#231
|
Гости |
а там надо было попробовать кинуть в папку с проектом qtшные библиотеки..
в общем собрал через Ж на вс2008 для этого пришлось закомментить вот эту фигню // Get DTR/RTS line states, // where variable temp return states. // ::DWORD bytesReturned = 0; /* if (::DeviceIoControl(this->descriptor, IOCTL_SERIAL_GET_DTRRTS, 0, 0, &temp, sizeof(::DWORD), &bytesReturned, 0)) { if (temp & SERIAL_DTR_STATE) status |= AbstractSerial::LineDTR; if (temp & SERIAL_RTS_STATE) status |= AbstractSerial::LineRTS; } */ и вот эту //#include <ddk/ntddser.h> но зато запустилось потом после сборки на вс компиляторе |
|
|
kuzulis |
3.3.2011, 20:32
Сообщение
#232
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
>>для этого пришлось закомментить вот эту фигню
Теперь не будут определяться статусы линий DTR/RTS. А чего-нить аналогичного #include <ddk/ntddser.h> разве нету в студийном компиляторе? Может можно попробовать просто #include <ntddser.h> ? И есть ли вообще такой заголовочник в студии? Сообщение отредактировал kuzulis - 3.3.2011, 20:52 |
|
|
Гость_Гость_* |
3.3.2011, 23:44
Сообщение
#233
|
Гости |
я не знаю я вообще не знаю что это за заголовок!
библиотека откомпилированная на qtcreator компилятором вс2008, работает только что проверил! большое спасибо! |
|
|
brauni |
29.3.2011, 10:22
Сообщение
#234
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 29.3.2011 Пользователь №: 2550 Спасибо сказали: 0 раз(а) Репутация: 0 |
to kuzulis
Собственно говоря вопрос такой: Мне нужно обеспечить обмен данными с железкой через COM порт. Есть 3 требования: 1. интерфейс должен быть отзывчивым 2. операцию должно быть можно прервать 3. тайм аут на операцию чтения записи, объективно, может быть 10+ секунд Собственно говоря в чём вопрос: вот я в дочернем потоке запустил операцию чтения и она залипла на 10 секунд. И в течении этих 10 секунд пользователь хочет прервать операцию. Как мне сделать так чтобы дочерний поток отлип? Можно ли просто в главном потоке вызвать функцию close() для объекта AbstractSerial, чтобы в дочернем потоке операция чтения завершилась с ошибкой? |
|
|
kuzulis |
29.3.2011, 11:44
Сообщение
#235
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Перед чтением сначала надо открыть порт в асинхронном режиме (без Unbuffered), убедиться что байты для чтения уже доступны (к примеру, доступно N-ное их количество по readyRead() или bytesavailable()), а потом читать их.
В этом случае чтение будет "мгновенным" и ничего отменять не нужно будет, и, тем, более, не нужно ожидать пока они (байты) появятся. В общем, класс порта работает также как и класс сокета, вот и пляшите от этого. Ничего конкретного не подскажу, сами попробуйте. PS: Если честно, то мне не совсем понятна суть работы с вашей железякой и зачем оно надо. |
|
|
brauni |
29.3.2011, 12:18
Сообщение
#236
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 29.3.2011 Пользователь №: 2550 Спасибо сказали: 0 раз(а) Репутация: 0 |
С TCP/IP сокетами у меня такой фокус прокатывал.
Дело в том, что железка ещё не готова, но программа под неё уже пишется. Так что техническое решение уже нужно а попробовать руками не могу иначе бы сам проверил. Можно считать, что железка занимается аппаратным ускорением долгих операций. Например шифрования и с необкатанным алгоритмом работает долго, отсюда и тайм аут. Работа происходит так: отправляем железке данные, и ждём ответа от неё сколько ждать заранее не известно. Может и за сотые доли секунды справиться, а может и надолго зависнуть. Каждый раз ожидать 10 секунд(максимальное время работы) в асинхронном режиме не вариант, так как большая доля операций выполняется реально быстро. Как я планировал написать программу: открываем новый поток в нем общаемся с железкой в небуфферизированном режиме(он понятнее, а дочерний поток можно и блокировать), в случае если пользователь выбирает сброс соединения, выполняем метод close(), дочерний поток завершает свою работу с ошибкой. |
|
|
d2r |
7.4.2011, 11:23
Сообщение
#237
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 24.3.2011 Пользователь №: 2534 Спасибо сказали: 1 раз(а) Репутация: 0 |
А как узнать, подключено ли к порту какое-либо устройство? То есть что бы при подключении устройства к com порту программа как либо сигнализировала об этом
Это необходимо будет по таймеру пытаться считывать данные с порта? Или есть другой способ? |
|
|
kuzulis |
7.4.2011, 19:35
Сообщение
#238
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
А как узнать, подключено ли к порту какое-либо устройство? Никак. Это необходимо будет по таймеру пытаться считывать данные с порта? Или есть другой способ? Открыть порт и приконектиться к сигналу readyRead(). И когда от устройства (если оно есть) придут данные - то прочитать их. Никаких таймеров не нужно (за исключением, если необходимо просигнализировать о таймауте ожидания от устройства данных). Как то так. |
|
|
d2r |
8.4.2011, 12:28
Сообщение
#239
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 24.3.2011 Пользователь №: 2534 Спасибо сказали: 1 раз(а) Репутация: 0 |
Не получается создать список AbstractSerial
QList<AbstractSerial> portList; AbstractSerial *port = new AbstractSerial(this); portList.push_back(port); ========================== ошибка: no matching function for call to 'QList<AbstractSerial>::push_back(AbstractSerial*&)' а если так: QList<AbstractSerial> portList; AbstractSerial port = new AbstractSerial(this); portList.push_back(port); то: ошибка: conversion from 'AbstractSerial*' to non-scalar type 'AbstractSerial' requested блин, понял что это нахрен не нужно)))) Как удалить сообщение) можно обойтись и без списка, но все равно интересно |
|
|
d2r |
8.4.2011, 13:02
Сообщение
#240
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 24.3.2011 Пользователь №: 2534 Спасибо сказали: 1 раз(а) Репутация: 0 |
или как тогда слушать все порты в системе, если известно сколько портов открывать?
ps НЕ известно |
|
|
Текстовая версия | Сейчас: 28.11.2024, 20:23 |