Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Wait for single object, Трабл со временем приема из com порта 
:(
    Опции темы
KRTPC
Дата 3.8.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет



Люди я работаю с 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;



зарание спасибо да и я не спец то если можно и немного поясните если можно но буду рад всему 
PM MAIL   Вверх
ElcnU
Дата 3.8.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 28.4.2006

Репутация: нет
Всего: нет



в другом патоке и с помощью событий
PM MAIL   Вверх
KRTPC
Дата 3.8.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет



а как мне определить что порт свободен?
PM MAIL   Вверх
Romikgy
Дата 3.8.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



если открыть его не удасться значит занят smile а вообще он ошибку выдаст что порт открыт


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
KRTPC
Дата 4.8.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет



нужна помошь 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  
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
KRTPC
Дата 4.8.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет



переменная pory HANDEL и CreateFile возврашает тоже HANDEL если не так то поясни по подробнее что ты хочешь спросить smile 
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



то что она возвращает я знаю, что в ней при трасировке?
Код

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. 



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
KRTPC
Дата 4.8.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет



эту проверку я делаю и в ней ошибок нет.Ошибка появляется после writefile-код ошибки 997,
но в порт поишется и читается smile 
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



KRTPC, SetCommState
сначало имхо надо настроить порт для передачи

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ataru
Дата 7.4.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.9.2008

Репутация: нет
Всего: нет



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

вообще-то 997 это ERROR_IO_PENDING, а ERROR_NOACCESS = 998
PM MAIL   Вверх
maxim1000
Дата 7.4.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



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

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


--------------------
qqq
PM WWW   Вверх
GremlinProg
Дата 7.4.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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 убери


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 7.4.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



А не вариант посмотреть двумя темами ниже и увидеть работающий код ??? что за лень такая ?
Обмен по COM порту


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 8.4.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(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)



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.