Страница 1 из 1

Таймауты чтения с COM порта

Добавлено: 22 июл 2005, 13:26
SeregaLBN
Что-то не могу добиться нужного результата.
Есть железка, подключаемая в COM. Работает на скорости 19200.
Ещё известно что таймаут ожидания очередного байта - 1..2 сек.
После отправки запроса на железку, оператор должен с ним поработать. И после этого девайс отвечает.
На всё это (ввод данных оператором и ответ железки) я даю 30 сек.
Я немогу добится следующего - когда девайс вообще неподключён к порту, мне, получается, надо что бы через 30 сек ф-ция ReadFile отработалась с таймаутом.
Делаю так:

Код: Выделить всё

BOOL CComPort::SetCommReadTimeOuts(DWORD dwReadIntervalTimeout, DWORD dwReadTotalTimeoutMultiplier, DWORD dwReadTotalTimeoutConstant) {
   COMMTIMEOUTS CommTimeOuts;
   BOOL bRes =  ::GetCommTimeouts(m_hCom, &CommTimeOuts);
   if (!bRes) {
      //...
   }

   CommTimeOuts.ReadIntervalTimeout        = dwReadIntervalTimeout;        // Maximum time between read chars
   CommTimeOuts.ReadTotalTimeoutMultiplier = dwReadTotalTimeoutMultiplier; // Multiplier of characters.
   CommTimeOuts.ReadTotalTimeoutConstant   = dwReadTotalTimeoutConstant;   // Constant in milliseconds.

   bRes &= ::SetCommTimeouts(m_hCom, &CommTimeOuts);
   if (!bRes) {
      //...
   }

   return bRes;
}
ну и вызываю так:

Код: Выделить всё

   DWORD dwReadIntervalTimeout        = 2000;  // таймаут ожидания очередного байта
   DWORD dwReadTotalTimeoutMultiplier = 294;   // читаю по 512 байт. Используется 8 бит на символ, без чётности и 2 стоповых бита. Т.е. 512*(8+2)/19200 = 0.29333 сек.
   DWORD dwReadTotalTimeoutConstant   = 30000; // 30 сек на всё
   m_Com.SetCommReadTimeOuts(dwReadIntervalTimeout, dwReadTotalTimeoutMultiplier, dwReadTotalTimeoutConstant);
Вот с таким вызовом ReadFile возвращает WAIT_TIMEOUT через 2 сек.
Как мне добиться нужного результата?
Подскажите, плз!