QSerialDevice - Библиотека для работы с COM-портами |
Здравствуйте, гость ( Вход | Регистрация )
QSerialDevice - Библиотека для работы с COM-портами |
RazrFalcon |
11.3.2013, 16:17
Сообщение
#411
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Угу. Видел. Проверю.
По поводу устройства. Еще более интересно. Дали мне сорцы оригинальной проги, на дельфи, которая работает отлично. Вот как она открывает (перевел на c++), отличия от QtSerialPort:
SetCommState не используется вообще. В итоге сделав как в ней и закоментировав SetCommState, так как на нем ошибка. Теперь не могу дождаться ответа. Дебаг повисатет на:
То есть прога тупо зависает, ждет как я понимаю ответа, но он не приходит. Полный код функции на дельфи: Раскрывающийся текст
PS: сомневаюсь что патч с vid/pid не заработает. rightJustified не может не работать Сообщение отредактировал RazrFalcon - 11.3.2013, 16:10 |
|
|
Алексей1153 |
11.3.2013, 17:01
Сообщение
#412
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
CommTimeouts.ReadIntervalTimeout:=MAXDWORD;
ну ну ждать будешь дооооолго. Примерно 50 суток Сообщение отредактировал Алексей1153 - 11.3.2013, 17:04 |
|
|
RazrFalcon |
11.3.2013, 17:43
Сообщение
#413
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
В QtSerialPort так же =/
Да и код не мой. Сообщение отредактировал RazrFalcon - 11.3.2013, 17:44 |
|
|
Алексей1153 |
11.3.2013, 18:05
Сообщение
#414
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
RazrFalcon, этот таймаут - максимально позволяемое время между принимаемыми байтами. Раньше придёт - хорошо, а пока не приходит, функция держит управление. По таймауту (с учётом множителя и общего таймаута на чтение) возвращается ошибка - не удалось чтение
Как в других системах, не знаю, а в винде, чтобы таких затыканий не происходило, для синхронного режима вызывают функцию ClearCommError, откуда можно узнать, сколько сейчас уже принято байтов в буфере системы. Эти байты всегда считаются без задержек и управление тут же вернётся |
|
|
RazrFalcon |
11.3.2013, 18:14
Сообщение
#415
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
По поводу детекта отключения на винде.
CommOverlappedEventNotifier error = false Всё. read и write не вызываются. Что-то конкретное проверить может? Алексей1153, это понятно. Только толку? Я не автор либы. Почему повисает понятно. По таймауту. Но повисать не должна, вот в чем затык. |
|
|
kuzulis |
11.3.2013, 18:46
Сообщение
#416
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Цитата(RazrFalcon) По поводу детекта отключения на винде. CommOverlappedEventNotifier error = false Всё. read и write не вызываются. Что-то конкретное проверить может? Да, какое значение у triggeredEventMask и у originalEventMask в CommOverlappedEventNotifier::processCompletionRoutine()? Цитата CommTimeouts.ReadIntervalTimeout:=MAXDWORD; ну ну ждать будешь дооооолго. Примерно 50 суток Нет, как раз наоборот. Почитай MSDN. Цитата(RazrFalcon) Полный код функции на дельфи: Нет. Открывают аналогично, таймауты такие-же. Отличия в том, что дельфовый вариант не использует OVERLAPPED режим порта, а также не устанавливает DCB структуру.. Хм.. т.е. скорость порта невозможно установить? Цитата(RazrFalcon) В итоге сделав как в ней и закоментировав SetCommState, так как на нем ошибка. Теперь не могу дождаться ответа. Дебаг повисатет на: И будет зависать, т.к. открыто без FILE_FLAG_OVERLAPPED. Фишка еще в том, что этот флаг обязательно нужен для QtSerialPort - без него оно вообще не будет работать. Цитата(RazrFalcon) Пока что вышел на ошибку. И она до смешного популярна в гугле и именно с микрочипом. SetCommState возвращает ошибку номер 31... Да уж, обхохочешься: Цитата ERROR_GEN_FAILURE 31 (0x1F) A device attached to the system is not functioning. Цитата(RazrFalcon) PS: сомневаюсь что патч с vid/pid не заработает. rightJustified не может не работать Уже отказались от этого патча. Забудь. По другому там надо делать. Сообщение отредактировал kuzulis - 11.3.2013, 18:51 |
|
|
Алексей1153 |
11.3.2013, 19:11
Сообщение
#417
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
kuzulis, ага, подзабылось ) Но это не отменяет практику чистить ошибку
|
|
|
RazrFalcon |
11.3.2013, 19:19
Сообщение
#418
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
triggeredEventMask = 1
originalEventMask = 129 Цитата Отличия в том, что дельфовый вариант не использует OVERLAPPED режим порта, ну по этому и по другомуа также не устанавливает DCB структуру.. просто прога на дельфях то пашет, пусть и 31-н ошибка... да и на маке и лине, udev как я понимаю, справляется нормально про патч - ок, себе добавил. у меня и так тоже самое было, только уже в самой проге |
|
|
kuzulis |
12.3.2013, 10:01
Сообщение
#419
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Цитата(RazrFalcon) triggeredEventMask = 1 originalEventMask = 129 Ох. Вот это вот и хреновенько. Т.е. тут уже не определишь что устройство выткнуто. Хорошо, тогда вот что: в коде после того как ты выдернул шнурок, т.к. triggeredEventMask = 1 (EV_RXCHAR), то должен запуститься startAsyncRead(), а после него - completeAsyncRead(). Так вот, проверь, есть ли какие-нить ошибки после ReadFile() в startAsyncRead() или еще где нить? Т.к. если никаких ошибок нет - то невозможно отловить выдергивание. А если все-таки ошибки есть и GetLastError их возвращает, то приведи номер ошибки и скажи после какой операции она возникла. Все дело в драйвере шнурка, возможно поможет установка последнего драйвера от FTDI (мы же про FTDI говорим в данном случае?) Цитата(RazrFalcon) ну по этому и по другому просто прога на дельфях то пашет, пусть и 31-н ошибка... Ну так на дельфях и не используется много чего. Это не проблема QtSerialPort - это проблема драйвера устройства. Если он гогно - то тут ничего не сделаешь. Только обновить драйвер. Цитата(RazrFalcon) да и на маке и лине, udev как я понимаю, справляется нормально Ну, ты сравнил теплое с мягким. Сообщение отредактировал kuzulis - 12.3.2013, 10:03 |
|
|
RazrFalcon |
12.3.2013, 12:46
Сообщение
#420
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
startAsyncRead
1) первое условие не выполнилось, на чтение буфера 2) второе тоже (то есть указатель забрало нормально) 3) файл не прочло 4) QSerialPort::PermissionError 5) Поменяло на ReadError 6) вернуло false Как временная заглушка, на винде и на ReadError проверяю. Но это как то не очень, вроде бы. Сообщение отредактировал RazrFalcon - 12.3.2013, 12:52 |
|
|
Текстовая версия | Сейчас: 24.11.2024, 4:16 |