Я читаю из COM порта по таймеру,
но при остановке вылетает критическая ошибка.
Я останавливаю сначала таймер, затем закрываю порт.
Ошибка вылетает вне моей программы, где-то в системной DLL.
(Если порт не закрывать, то этой ошибки нет)
Здравствуйте nick_serg, Вы писали:
NS>Я читаю из COM порта по таймеру, NS>но при остановке вылетает критическая ошибка.
Что значит при остановке? При остановке программы? Тогда все верно. Сначала нужно остановить таймер, а потом закрыть хэндл порта, иниче в процедуре обработки сообщения таймера будет попытка обращения к несуществующему хэндлу — как результат непредсказуемые ошибки. bialix
Здравствуйте BiAlix, Вы писали:
BA>Здравствуйте nick_serg, Вы писали:
NS>>Я читаю из COM порта по таймеру, NS>>но при остановке вылетает критическая ошибка. BA>Что значит при остановке? При остановке программы? Тогда все верно. Сначала нужно остановить таймер, а потом закрыть хэндл порта, иниче в процедуре обработки сообщения таймера будет попытка обращения к несуществующему хэндлу — как результат непредсказуемые ошибки. bialix :no:
Я же написал NS>>Я останавливаю сначала таймер, затем закрываю порт.
Причем я даже делал специальный флаг, который выключал даже перед остановкой таймера,
а в обработчике таймера если он выключен ничего не происходит (не помогло)
Здравствуйте nick_serg, Вы писали:
NS>Я читаю из COM порта по таймеру, NS>но при остановке вылетает критическая ошибка. NS>Я останавливаю сначала таймер, затем закрываю порт. NS>Ошибка вылетает вне моей программы, где-то в системной DLL. NS>(Если порт не закрывать, то этой ошибки нет)
Может ты в какомнибудь деструкторе или в функции деинициализации обращаешься к порту после его закрытия.
Проверь.
Удачи.
Здравствуйте Максим Алексейкин, Вы писали:
NS>>Я читаю из COM порта по таймеру, NS>>но при остановке вылетает критическая ошибка. NS>>Я останавливаю сначала таймер, затем закрываю порт. NS>>Ошибка вылетает вне моей программы, где-то в системной DLL. NS>>(Если порт не закрывать, то этой ошибки нет)
!!! Перед закрытием СОМа надобно его clear-ить (очищать ошибки!!!) что то
типа этого:
Здравствуйте Alex Smirnov, Вы писали:
AS> AS> !!! Перед закрытием СОМа надобно его clear-ить (очищать ошибки!!!) что то AS> типа этого: AS> SetCommMask(m_hPort, 0); AS> while(m_dwReadThreadID != 0) Sleep(10); // поток чтения порта AS> m_hReadThread = 0; AS> EscapeCommFunction(m_hPort, CLRDTR); AS> PurgeComm(m_hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); AS> CloseHandle(m_hPort); m_hPort = 0;
Что-то ты путаешь. Если закрыть порт то ВСЕ данные (включая ошибки) будут подчищены драйвером. После этого железяка не будет ничего принимать и отправлять. Так что закрывать порт можно смело, но после закрытия нельзя обращаться к его хэндлу.
ICQ #311116826
Re[4]: com-port and timer
От:
Аноним
Дата:
26.07.02 11:21
Оценка:
Здравствуйте Максим Алексейкин, Вы писали:
МА>Что-то ты путаешь. Если закрыть порт то ВСЕ данные (включая ошибки) будут подчищены драйвером. После этого железяка не будет ничего принимать и отправлять. Так что закрывать порт можно смело, но после закрытия нельзя обращаться к его хэндлу. МА> :))) :))) :))) :))) :)))
:maniac: Хотелось бы увидеть надпись: 'Драйвер COMа подчистит за вас все
ошибки....' где нибуть к его описанию... :wow: НЕТ!!! Если берёшся работать с ним — будь любезен подчишать за собой!!!
Привет все!
А> Хотелось бы увидеть надпись: 'Драйвер COMа подчистит за вас все А> ошибки....' где нибуть к его описанию... НЕТ!!! Если берёшся работать с ним — будь любезен подчишать за собой!!!
-- Вообще говоря СОМ-порт как и Восток дело тонкое, даже в разных ОС (9х и NT) он ведет себя немножко по-разному, а подчищать за собой — это наверное лучшее решение. А еще лучше во время закрытия проверить CloseHandle на возвращаемое значение (это из серии идиотских проверок) -- нет ли в ЭТОМ месте какой-нибудь ошибки (типа попытка закрыть хэндл дважды).
Хотя у себя в программах я никогда не ДЕЛАЛ ошибки при работе с СОМ-портом (как их вообще можно сделать если работать с ним нормально?) и закрывая хэндл порта никаких ошибок не получал, даже без "подчистки". Закрыл Хэндл — ОС удалила объект со всеми его соплями и еррорами. Все.
Здравствуйте BiAlix, Вы писали:
BA>-- Вообще говоря СОМ-порт как и Восток дело тонкое, даже в разных ОС (9х и NT) он ведет себя немножко по-разному, а подчищать за собой — это наверное лучшее решение. А еще лучше во время закрытия проверить CloseHandle на возвращаемое значение (это из серии идиотских проверок) -- нет ли в ЭТОМ месте какой-нибудь ошибки (типа попытка закрыть хэндл дважды). BA> Хотя у себя в программах я никогда не ДЕЛАЛ ошибки при работе с СОМ-портом (как их вообще можно сделать если работать с ним нормально?) и закрывая хэндл порта никаких ошибок не получал, даже без "подчистки". Закрыл Хэндл — ОС удалила объект со всеми его соплями и еррорами. Все. BA>
Я под ошибкой, в данном случае, понимаю внутреннюю ошибку порта о которой он сигналит, если ему приказать. Не больше и не меньше. Такие "ошибки" подчищать не надо. А как предлагили покласть ноги у порта, зачем, они и сами упадут. Других ошибок при нормальной работе (да и наверное при не нормальной ) не произойдет. Т.е. остается прежний подозреваемый хэндл. Ну не надо его трогать после закрытия
Удачи
Здравствуйте nick_serg, Вы писали:
NS>Я читаю из COM порта по таймеру, NS>но при остановке вылетает критическая ошибка. NS>Я останавливаю сначала таймер, затем закрываю порт. NS>Ошибка вылетает вне моей программы, где-то в системной DLL. NS>(Если порт не закрывать, то этой ошибки нет)
Каким таймером пользуещся?
Дело в том что некоторые даже после остановки могут еще раз вызвать callback(или event).