Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
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
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 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
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 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
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 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 |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 27.12.2025, 15:13 |