GetCommModemStatus
От: rsdn_v  
Дата: 17.03.04 09:58
Оценка:
Всем привет.

Вопрос такой — всегда ли GetCommModemStatus в состоянии определить статус ком-порт, и, если нет, то можно ли об этом узнать.

Вопрос возник из такой ситуации : есть программа, есть железка, работающая через com-порт. Перед обменом инф-цией с этой железкой нужно выставить ей DTR и дождаться от неё CTS или DSR. После этого можно общаться. Выяснилось, что на компьютере разработчика всё работает как тут описано (как обычно и бывает ;), но на некоторых (не на всех) компьютерах клиентов GetCommModemStatus всегда возвращает 0, хотя реально железка выставляет CTS (или DSR — неважно ;)

Буду рад услышать дельные соображения ;)

Спасибо, Влад
Re: GetCommModemStatus
От: rsdn_v  
Дата: 22.03.04 13:18
Оценка:
_> Буду рад услышать дельные соображения ;)

Вопрос криво поставлен или умельцев здесь нет ?
Re[2]: GetCommModemStatus
От: Злость Россия  
Дата: 22.03.04 13:28
Оценка: 1 (1)
Здравствуйте, rsdn_v, Вы писали:

_>> Буду рад услышать дельные соображения


_> Вопрос криво поставлен или умельцев здесь нет ?


Раз вы такое пишете.

То могу только сказать — вы как минимум забыли указать что возвращает GetLastError после того как GetCommModemStatus вернула 0.

И поскриптум... Вы нас на понт не берите
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: GetCommModemStatus
От: rsdn_v  
Дата: 22.03.04 14:00
Оценка:
Здравствуйте, Злость, Вы писали:
...
З>То могу только сказать — вы как минимум забыли указать что возвращает 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


З>И поскриптум... Вы нас на понт не берите :-))

Дык и меня не стоит брать ;)
Re[4]: GetCommModemStatus
От: Злость Россия  
Дата: 22.03.04 14:12
Оценка:
Здравствуйте, 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 — на какой работает, а на кокой нет ?
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[5]: GetCommModemStatus
От: rsdn_v  
Дата: 22.03.04 14:20
Оценка:
Здравствуйте, Злость, Вы писали:

З>Какая платформа. W9X или NT — на какой работает, а на кокой нет ?


W2K — в обоих случаях, машины разные. Не работало на машине с какой-то
microATX матерью (не было возможности узнать точнее) и процессором Via
гигагерцовым.
Re[6]: GetCommModemStatus
От: Злость Россия  
Дата: 22.03.04 14:26
Оценка:
Здравствуйте, rsdn_v, Вы писали:

_>Здравствуйте, Злость, Вы писали:


З>>Какая платформа. W9X или NT — на какой работает, а на кокой нет ?


_>W2K — в обоих случаях, машины разные. Не работало на машине с какой-то

_>microATX матерью (не было возможности узнать точнее) и процессором Via
_>гигагерцовым.

Попробуй примерно такой код


#define DSR_TIMEOUT 1000L
DWORD dwModemStatus;
DWORD dwStartTime, dwNowTime;
dwStartTime = dwNowTime = GetTickCount();
do {
   GetCommModemStatus(hCom, &dwModemStatus);
   if (!(dwModemStatus & MS_DSR_ON)) Sleep(50);
   dwNowTime = GetTickCount();
} while ((!(dwModemStatus & MS_DSR_ON)) && (labs(dwStartTime - dwNowTime) < DSR_TIMEOUT));
if (!(dwModemStatus & MS_DSR_ON)) {
}
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[4]: GetCommModemStatus
От: Sergeant Украина www.photomirror.com.ua
Дата: 22.03.04 14:33
Оценка:
Здравствуйте, 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, что, согласно МСДН говорит о том, что фиче не поддерживается железом.
Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить?
Курить я буду, но пить не брошу.
Re[7]: GetCommModemStatus
От: rsdn_v  
Дата: 22.03.04 14:35
Оценка:
Здравствуйте, Злость, Вы писали:

...
З>Попробуй примерно такой код

...

Вот мой код

  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;
Re[5]: GetCommModemStatus
От: rsdn_v  
Дата: 22.03.04 14:40
Оценка:
Здравствуйте, Sergeant, Вы писали:

_>>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware



S>Видел нечто подобное. Там проблема была в том, что перед вызовом QueryPerformanceFrequency человек объявлял указатель на структуру LARGE_INTEGER *lpFrequency, но забывал выделить под нее память. В результате получалась как раз такая ситуация: GetLastError = 0, но и функция возвращает FALSE, что, согласно МСДН говорит о том, что фиче не поддерживается железом.


Т.е. ф-ция может вернуть не 0, а GetLastError будет 0 ? Интересный поворот ;)
Попробую при случае, спасибо.

S>Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить? ;)


Так для вызова GetCommModemStatus не под что память выделять ;)
Re[6]: GetCommModemStatus
От: Sergeant Украина www.photomirror.com.ua
Дата: 22.03.04 14:46
Оценка:
Здравствуйте, rsdn_v, Вы писали:

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


_>>>однако, GetLastError возвращает 0, и хотелось бы знать — как распознать такое кривое hardware



S>>Видел нечто подобное. Там проблема была в том, что перед вызовом QueryPerformanceFrequency человек объявлял указатель на структуру LARGE_INTEGER *lpFrequency, но забывал выделить под нее память. В результате получалась как раз такая ситуация: GetLastError = 0, но и функция возвращает FALSE, что, согласно МСДН говорит о том, что фиче не поддерживается железом.


_> Т.е. ф-ция может вернуть не 0, а GetLastError будет 0 ? Интересный поворот

_>Попробую при случае, спасибо.
Точнее — там была ситуация такая, что релиз-сборка работала нормально, а дебаг — функция возвращает FALSE и GetLastError — 0.

S>>Ошибка дурная, и все-таки, проверьте: а вдруг забыли память выделить?


_> Так для вызова GetCommModemStatus не под что память выделять

Точно, это я сглупил.
Курить я буду, но пить не брошу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.