Вопрос такой — всегда ли GetCommModemStatus в состоянии определить статус ком-порт, и, если нет, то можно ли об этом узнать.
Вопрос возник из такой ситуации : есть программа, есть железка, работающая через com-порт. Перед обменом инф-цией с этой железкой нужно выставить ей DTR и дождаться от неё CTS или DSR. После этого можно общаться. Выяснилось, что на компьютере разработчика всё работает как тут описано (как обычно и бывает ;), но на некоторых (не на всех) компьютерах клиентов GetCommModemStatus всегда возвращает 0, хотя реально железка выставляет CTS (или DSR — неважно ;)
Здравствуйте, rsdn_v, Вы писали:
_>> Буду рад услышать дельные соображения
_> Вопрос криво поставлен или умельцев здесь нет ?
Раз вы такое пишете.
То могу только сказать — вы как минимум забыли указать что возвращает GetLastError после того как GetCommModemStatus вернула 0.
И поскриптум... Вы нас на понт не берите
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Злость, Вы писали:
... З>То могу только сказать — вы как минимум забыли указать что возвращает GetLastError после того как GetCommModemStatus вернула 0.
Да, каюсь, не сказал — после всех вызовов API стоит проверка GetLastError, и если там не 0,
то ClearCommError. Причём рез-ты этого пишутся в протокол (если есть что писать ;).
Могу уверить, что GetLastError возвращал 0.
В MSDN написано
"The function fails if the hardware does not support the control-register values"
однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware
З>И поскриптум... Вы нас на понт не берите :-))
Дык и меня не стоит брать ;)
Здравствуйте, rsdn_v, Вы писали:
_>Здравствуйте, Злость, Вы писали: _>... З>>То могу только сказать — вы как минимум забыли указать что возвращает GetLastError после того как GetCommModemStatus вернула 0.
_> Да, каюсь, не сказал — после всех вызовов API стоит проверка GetLastError, и если там не 0, _>то ClearCommError. Причём рез-ты этого пишутся в протокол (если есть что писать . _>Могу уверить, что GetLastError возвращал 0.
_> В MSDN написано _>"The function fails if the hardware does not support the control-register values"
_>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware
З>>И поскриптум... Вы нас на понт не берите _> Дык и меня не стоит брать
Из вас инфу надо вытягивать?
Какая платформа. W9X или NT — на какой работает, а на кокой нет ?
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Злость, Вы писали:
З>Какая платформа. W9X или NT — на какой работает, а на кокой нет ?
W2K — в обоих случаях, машины разные. Не работало на машине с какой-то
microATX матерью (не было возможности узнать точнее) и процессором Via
гигагерцовым.
Здравствуйте, rsdn_v, Вы писали:
_>Здравствуйте, Злость, Вы писали:
З>>Какая платформа. W9X или NT — на какой работает, а на кокой нет ?
_>W2K — в обоих случаях, машины разные. Не работало на машине с какой-то _>microATX матерью (не было возможности узнать точнее) и процессором Via _>гигагерцовым.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, rsdn_v, Вы писали:
_>Здравствуйте, Злость, Вы писали: _> Да, каюсь, не сказал — после всех вызовов API стоит проверка GetLastError, и если там не 0, _>то ClearCommError. Причём рез-ты этого пишутся в протокол (если есть что писать . _>Могу уверить, что GetLastError возвращал 0.
_> В MSDN написано _>"The function fails if the hardware does not support the control-register values"
_>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware
Видел нечто подобное. Там проблема была в том, что перед вызовом QueryPerformanceFrequency человек объявлял указатель на структуру LARGE_INTEGER *lpFrequency, но забывал выделить под нее память. В результате получалась как раз такая ситуация: GetLastError = 0, но и функция возвращает FALSE, что, согласно МСДН говорит о том, что фиче не поддерживается железом.
Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить?
EscapeCommFunction(FComHandle, CLRDTR);
EscapeCommFunction(FComHandle, CLRRTS);
CheckError('InitPort.EscapeCommFunction(CLRRTS)');
EscapeCommFunction(FComHandle, SETDTR);
CheckError('InitPort.EscapeCommFunction(SETDTR)');
for i := 0 to 3000 div 50 do
begin
if FComHandle = INVALID_HANDLE_VALUE
then Exit;
dwMask := 0;
GetCommModemStatus(FComHandle, dwMask);
CheckError('InitPort.GetCommModemStatus');
Result := dwMask and (MS_CTS_ON or MS_DSR_ON) <> 0;
if Result
then Break;
Sleep(50);
end;
Здравствуйте, Sergeant, Вы писали:
_>>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware
S>Видел нечто подобное. Там проблема была в том, что перед вызовом QueryPerformanceFrequency человек объявлял указатель на структуру LARGE_INTEGER *lpFrequency, но забывал выделить под нее память. В результате получалась как раз такая ситуация: GetLastError = 0, но и функция возвращает FALSE, что, согласно МСДН говорит о том, что фиче не поддерживается железом.
Т.е. ф-ция может вернуть не 0, а GetLastError будет 0 ? Интересный поворот ;)
Попробую при случае, спасибо.
S>Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить? ;)
Так для вызова GetCommModemStatus не под что память выделять ;)
Здравствуйте, rsdn_v, Вы писали:
_>Здравствуйте, Sergeant, Вы писали:
_>>>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware
S>>Видел нечто подобное. Там проблема была в том, что перед вызовом QueryPerformanceFrequency человек объявлял указатель на структуру LARGE_INTEGER *lpFrequency, но забывал выделить под нее память. В результате получалась как раз такая ситуация: GetLastError = 0, но и функция возвращает FALSE, что, согласно МСДН говорит о том, что фиче не поддерживается железом.
_> Т.е. ф-ция может вернуть не 0, а GetLastError будет 0 ? Интересный поворот _>Попробую при случае, спасибо.
Точнее — там была ситуация такая, что релиз-сборка работала нормально, а дебаг — функция возвращает FALSE и GetLastError — 0.
S>>Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить?
_> Так для вызова GetCommModemStatus не под что память выделять
Точно, это я сглупил.