Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Wait for single object


Автор: KRTPC 3.8.2006, 10:09
Люди я работаю с GSM модемом и не факт что он всегда ответит и по этому я использую Wait for single object. Я пишу в порт с помошью WriteFile сбрасываю событие ResetEvent  и жду приема Wait for single object. WaitComEvent неподходит так как модем может не ответить и прога зависнет. Как правильно дождаться приема и считать а по истечению таймера сказать что устройство вовремя не ответило
вот мой кусок как я пытаюсь сделать подскажите как исправить или дайте свой пример


Код

HANDEL portcomm;
OVERLAPPED              ovr={0};
ovr.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WriteFile(portcomm,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr))
        {
                ShowMessage("Невозможно передать в порт");
        }
        /*
        ResetEvent(ovr.hEvent);
        event_com=WaitForSingleObject(ovr.hEvent,10000);
        switch (event_com)
        {
        case WAIT_ABANDONED:
        {
                GetOverlappedResult(port_ptr,&ovr,&bc,FALSE);
                ReadFile(port_ptr,buf_in,100,&bc,&ovr);
                Label1->Caption= buf_in;
        }
        break;
        case WAIT_TIMEOUT:
                ShowMessage("Устройство вовремя не ответило");
        break;
        case WAIT_FAILED:
                ShowMessage("ERROR");
        break;



зарание спасибо да и я не спец то если можно и немного поясните если можно но буду рад всему 

Автор: ElcnU 3.8.2006, 10:25
в другом патоке и с помощью событий

Автор: KRTPC 3.8.2006, 10:48
а как мне определить что порт свободен?

Автор: Romikgy 3.8.2006, 10:54
если открыть его не удасться значит занят smile а вообще он ошибку выдаст что порт открыт

Автор: KRTPC 4.8.2006, 09:39
нужна помошь smile 
Код

HANDLE                  port;
OVERLAPPED           ovr={0};

port = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,            
 FILE_FLAG_OVERLAPPED, NULL);        
                                   
WriteFile(port,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr);


на операцию WriteFile прога выдает ошибку 997 ERROR_NOACCESS 
при этом в порт пишется и из порта можно считать но не понятно откуда ошибка??? smile  

Автор: Romikgy 4.8.2006, 11:02
Цитата(KRTPC @  4.8.2006,  08:39 Найти цитируемый пост)
port = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,             FILE_FLAG_OVERLAPPED, NULL);  

после этого в переменой порт что?

Автор: KRTPC 4.8.2006, 12:38
переменная pory HANDEL и CreateFile возврашает тоже HANDEL если не так то поясни по подробнее что ты хочешь спросить smile 

Автор: Romikgy 4.8.2006, 12:51
то что она возвращает я знаю, что в ней при трасировке?
Код

if (port == INVALID_HANDLE_VALUE) {
    dwError = GetLastError();

    /* handle error */
}



такую проверку сделай после криате файла
Код

Communications Resources

The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDistribution parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read-write access can be specified, and the handle can be opened for overlapped I/O. 

Автор: KRTPC 4.8.2006, 14:28
эту проверку я делаю и в ней ошибок нет.Ошибка появляется после writefile-код ошибки 997,
но в порт поишется и читается smile 

Автор: Romikgy 4.8.2006, 15:17
KRTPC, SetCommState
сначало имхо надо настроить порт для передачи

Добавлено @ 15:23 
http://vingrad.ru/CPP-FAQ-002452

Автор: Ataru 7.4.2009, 16:37
Цитата(KRTPC @ 4.8.2006,  09:39)
на операцию WriteFile прога выдает ошибку 997 ERROR_NOACCESS 
при этом в порт пишется и из порта можно считать но не понятно откуда ошибка???

вообще-то 997 это ERROR_IO_PENDING, а ERROR_NOACCESS = 998

Автор: maxim1000 7.4.2009, 17:27
Цитата(KRTPC @  4.8.2006,  09:39 Найти цитируемый пост)
WriteFile(port,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr);

довольно опасная строка
std::string не гарантирует, что пока WriteFile будет писать, там ничего не поменяется или буфер вообще не переаллокейтится в другое место

Автор: GremlinProg 7.4.2009, 19:08
ResetEvent тут точно стабильности не прибавит
сразу перед сбросом, операция может завершится и на тебе - дедлок на 10 сек и дальнейшая потеря управления над этим буфером
а GetOverlappedResult без ожидания - не дает гарантии, что ее вызов потребуется только единожды (тут цикл нужен, пока не будет передано требуемое число байт)

кстати, к чему тут WAIT_ABANDONED?
Цитата(WaitForSingleObject @ MSDN)

WAIT_ABANDONED
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread, and the mutex is set to nonsignaled.

If the mutex was protecting persistent state information, you should check it for consistency.

GetOverlappedResult и т.п. ставь в ветку WAIT_TIMEOUT
а WAIT_ABANDONED убери

Автор: Dem_max 7.4.2009, 19:17
А не вариант посмотреть двумя темами ниже и увидеть работающий код ??? что за лень такая ?
http://forum.vingrad.ru/forum/topic-254046/kw-com-порт.html

Автор: xvr 8.4.2009, 11:16
Цитата(KRTPC @ 3.8.2006,  10:09)
Люди я работаю с GSM модемом и не факт что он всегда ответит и по этому я использую Wait for single object. Я пишу в порт с помошью WriteFile сбрасываю событие ResetEvent  и жду приема Wait for single object. 

Прием осуществляется функцией ReadFile, а ее в исходнике не наблюдается  smile 
Для отправки и последующего приема последовательность действий должна быть такой:
Код

ResetEvent()
WriteFile()
if (error && GetLastError()==ERROR_IO_PENDING) GetOverlappedResult(..,TRUE);
ResetEvent()
ReadFile()
if (!error) -> All Ok
if (GetLastError()!=ERROR_IO_PENDING) -> read error
WaitForSingleObject(..,timeout)
if (timeout hit) {CancelO(); -> error timeout}
else GetOverlappedResult(...,FALSE)



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)