Таймауты чтения с COM порта
Добавлено: 22 июл 2005, 13:26
Что-то не могу добиться нужного результата.
Есть железка, подключаемая в COM. Работает на скорости 19200.
Ещё известно что таймаут ожидания очередного байта - 1..2 сек.
После отправки запроса на железку, оператор должен с ним поработать. И после этого девайс отвечает.
На всё это (ввод данных оператором и ответ железки) я даю 30 сек.
Я немогу добится следующего - когда девайс вообще неподключён к порту, мне, получается, надо что бы через 30 сек ф-ция ReadFile отработалась с таймаутом.
Делаю так:
ну и вызываю так:
Вот с таким вызовом ReadFile возвращает WAIT_TIMEOUT через 2 сек.
Как мне добиться нужного результата?
Подскажите, плз!
Есть железка, подключаемая в 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);
Как мне добиться нужного результата?
Подскажите, плз!