com-port and timer
От: nick_serg  
Дата: 24.07.02 13:59
Оценка:
Я читаю из COM порта по таймеру,
но при остановке вылетает критическая ошибка.
Я останавливаю сначала таймер, затем закрываю порт.
Ошибка вылетает вне моей программы, где-то в системной DLL.
(Если порт не закрывать, то этой ошибки нет)
Re: com-port and timer
От: BiAlix Украина  
Дата: 25.07.02 10:16
Оценка:
Здравствуйте nick_serg, Вы писали:

NS>Я читаю из COM порта по таймеру,

NS>но при остановке вылетает критическая ошибка.
Что значит при остановке? При остановке программы? Тогда все верно. Сначала нужно остановить таймер, а потом закрыть хэндл порта, иниче в процедуре обработки сообщения таймера будет попытка обращения к несуществующему хэндлу — как результат непредсказуемые ошибки. bialix
bialix
Re[2]: com-port and timer
От: nick_serg  
Дата: 25.07.02 14:15
Оценка:
Здравствуйте BiAlix, Вы писали:

BA>Здравствуйте nick_serg, Вы писали:


NS>>Я читаю из COM порта по таймеру,

NS>>но при остановке вылетает критическая ошибка.
BA>Что значит при остановке? При остановке программы? Тогда все верно. Сначала нужно остановить таймер, а потом закрыть хэндл порта, иниче в процедуре обработки сообщения таймера будет попытка обращения к несуществующему хэндлу — как результат непредсказуемые ошибки. bialix :no:


Я же написал
NS>>Я останавливаю сначала таймер, затем закрываю порт.
Причем я даже делал специальный флаг, который выключал даже перед остановкой таймера,
а в обработчике таймера если он выключен ничего не происходит (не помогло)
Re: com-port and timer
От: Максим Алексейкин Россия  
Дата: 25.07.02 14:25
Оценка:
Здравствуйте nick_serg, Вы писали:

NS>Я читаю из COM порта по таймеру,

NS>но при остановке вылетает критическая ошибка.
NS>Я останавливаю сначала таймер, затем закрываю порт.
NS>Ошибка вылетает вне моей программы, где-то в системной DLL.
NS>(Если порт не закрывать, то этой ошибки нет)

Может ты в какомнибудь деструкторе или в функции деинициализации обращаешься к порту после его закрытия.
Проверь.
Удачи.
ICQ #311116826
Re[2]: com-port and timer
От: Alex Smirnov Россия  
Дата: 26.07.02 06:59
Оценка: 1 (1)
Здравствуйте Максим Алексейкин, Вы писали:

NS>>Я читаю из COM порта по таймеру,

NS>>но при остановке вылетает критическая ошибка.
NS>>Я останавливаю сначала таймер, затем закрываю порт.
NS>>Ошибка вылетает вне моей программы, где-то в системной DLL.
NS>>(Если порт не закрывать, то этой ошибки нет)


!!! Перед закрытием СОМа надобно его clear-ить (очищать ошибки!!!) что то
типа этого:

//*******************************************************
SetCommMask(m_hPort, 0);

while(m_dwReadThreadID != 0) Sleep(10); // поток чтения порта
m_hReadThread = 0;

EscapeCommFunction(m_hPort, CLRDTR);
PurgeComm(m_hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(m_hPort); m_hPort = 0;
//*******************************************************

Alex
Re[3]: com-port and timer
От: Максим Алексейкин Россия  
Дата: 26.07.02 10:38
Оценка:
Здравствуйте 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: НЕТ!!! Если берёшся работать с ним — будь любезен подчишать за собой!!!

:super:
Re[5]: com-port and timer
От: BiAlix Украина  
Дата: 26.07.02 11:33
Оценка:
Привет все!

А> Хотелось бы увидеть надпись: 'Драйвер COMа подчистит за вас все

А> ошибки....' где нибуть к его описанию... НЕТ!!! Если берёшся работать с ним — будь любезен подчишать за собой!!!

-- Вообще говоря СОМ-порт как и Восток дело тонкое, даже в разных ОС (9х и NT) он ведет себя немножко по-разному, а подчищать за собой — это наверное лучшее решение. А еще лучше во время закрытия проверить CloseHandle на возвращаемое значение (это из серии идиотских проверок) -- нет ли в ЭТОМ месте какой-нибудь ошибки (типа попытка закрыть хэндл дважды).
Хотя у себя в программах я никогда не ДЕЛАЛ ошибки при работе с СОМ-портом (как их вообще можно сделать если работать с ним нормально?) и закрывая хэндл порта никаких ошибок не получал, даже без "подчистки". Закрыл Хэндл — ОС удалила объект со всеми его соплями и еррорами. Все.

bialix
Re[6]: com-port and timer
От: Максим Алексейкин Россия  
Дата: 26.07.02 12:22
Оценка:
Здравствуйте BiAlix, Вы писали:

BA>-- Вообще говоря СОМ-порт как и Восток дело тонкое, даже в разных ОС (9х и NT) он ведет себя немножко по-разному, а подчищать за собой — это наверное лучшее решение. А еще лучше во время закрытия проверить CloseHandle на возвращаемое значение (это из серии идиотских проверок) -- нет ли в ЭТОМ месте какой-нибудь ошибки (типа попытка закрыть хэндл дважды).

BA> Хотя у себя в программах я никогда не ДЕЛАЛ ошибки при работе с СОМ-портом (как их вообще можно сделать если работать с ним нормально?) и закрывая хэндл порта никаких ошибок не получал, даже без "подчистки". Закрыл Хэндл — ОС удалила объект со всеми его соплями и еррорами. Все.
BA>

Я под ошибкой, в данном случае, понимаю внутреннюю ошибку порта о которой он сигналит, если ему приказать. Не больше и не меньше. Такие "ошибки" подчищать не надо. А как предлагили покласть ноги у порта, зачем, они и сами упадут. Других ошибок при нормальной работе (да и наверное при не нормальной ) не произойдет. Т.е. остается прежний подозреваемый хэндл. Ну не надо его трогать после закрытия
Удачи
ICQ #311116826
Re: com-port and timer
От: Lostar Россия  
Дата: 27.07.02 08:16
Оценка:
Здравствуйте nick_serg, Вы писали:

NS>Я читаю из COM порта по таймеру,

NS>но при остановке вылетает критическая ошибка.
NS>Я останавливаю сначала таймер, затем закрываю порт.
NS>Ошибка вылетает вне моей программы, где-то в системной DLL.
NS>(Если порт не закрывать, то этой ошибки нет)

Каким таймером пользуещся?
Дело в том что некоторые даже после остановки могут еще раз вызвать callback(или event).
С уважением, Николай.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.