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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа COM порта в режиме ожидания. 
V
    Опции темы
Melevir
Дата 14.7.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цель следующая: к COM порту подключено устройство, которое само возвращает значения (когда ему вздумается). Требуется всего-то считать это значение. Я не понимаю как именно ожидание сделать. Предполагаю, что через несуществующее событие, но как конкретно не знаю.. Все что я сделал (ну этот код не совсем мой, взял с некоего форума) - инициализировал порт:
Код

    HANDLE hCom;
        
    hCom = CreateFile( "COM1",
        GENERIC_READ | GENERIC_WRITE,
        0,    
        NULL,  
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
        NULL
        );

    if (hCom == INVALID_HANDLE_VALUE) 
    {
        printf("CreateFile failed with error %d.\n", GetLastError());
        return;
    }


Хочу подсказки - что делать дальше?
Заранее благодаренsmile
PM MAIL   Вверх
Alca
Дата 14.7.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,    // exclusive access 
    NULL, // no security attributes 
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );

if (hCom == INVALID_HANDLE_VALUE) 
{
    // Handle the error. 
}

// Set the event mask. 

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess) 
{
    // Handle the error. 
}

// Create an event object for use in WaitCommEvent. 

o.hEvent = CreateEvent(
    NULL,   // no security attributes 
    FALSE,  // auto reset event 
    FALSE,  // not signaled 
    NULL    // no name 
    );

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
{
    if (dwEvtMask & EV_DSR) 
    {
         // To do.
    }

    if (dwEvtMask & EV_CTS) 
    {
         // To do. 
    }
}


Добавлено через 2 минуты и 8 секунд
http://msdn.microsoft.com/en-us/library/aa363479(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa363435(VS.85).aspx


--------------------
PM WWW ICQ Skype Jabber   Вверх
Melevir
Дата 14.7.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так, спасибо..
А какие библиотеки подключить надо? у меня на assert ругается.. Или может это потому что 6я версия среды?
И, собственно, как дотянуться до самого значения?

Это сообщение отредактировал(а) Melevir - 14.7.2009, 17:19
PM MAIL   Вверх
Alca
Дата 14.7.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



<assert.h>


--------------------
PM WWW ICQ Skype Jabber   Вверх
Melevir
Дата 14.7.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



EV_DSR EV_CTS - эти события не нужны, разве нет? Я знаю, что мне должна прийти строка из восьми символов, значит жду EV_RXCHAR и в цикле восемь раз вызываю нечто вроде ReadFile(hCom,buf,100,&bc,NULL); при этом маска такая: SetCommMask(hCom,EV_RXCHAR);
Я прав?
PM MAIL   Вверх
Alca
Дата 14.7.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Типа того  smile

Добавлено через 36 секунд
Получил нужный результат?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Melevir
Дата 14.7.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, буду пробовать. smile
PM MAIL   Вверх
Melevir
Дата 14.7.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчет результата не знаю - тестировать аппарат смогу только завтра и то ограниченное время..
Сейчас вопрос такой: вот пришло мне 8 байт. я же могу не восемь раз по байту читать, а сделать так:
Код

int rr;
AnsiString buf;
ReadFile(hCom,buf,8,&rr,NULL);

Это будет работать?

Не будет. А вот это компилируется:
Код

unsigned long rr;
DWORD buf;
ReadFile(hCom,&buf,8,&rr,NULL);

Но будет ли это верно выполнятся? Вроде должно..

Это сообщение отредактировал(а) Melevir - 14.7.2009, 22:12
PM MAIL   Вверх
Alca
Дата 14.7.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 15.7.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Melevir @ 14.7.2009,  21:32)
Сейчас вопрос такой: вот пришло мне 8 байт. я же могу не восемь раз по байту читать, а сделать так:
Код

int rr;
AnsiString buf;
ReadFile(hCom,buf,8,&rr,NULL);

Это будет работать?

Нет
Цитата

Не будет. А вот это компилируется:
Код

unsigned long rr;
DWORD buf;
ReadFile(hCom,&buf,8,&rr,NULL);

Но будет ли это верно выполнятся?
Нет. buf должен быть как минимум 8 байт размером, а не 4, как у вас.

Что касается ожидания, если в процессе лжидания НИЧЕГО больше делать не надо, то открывайте порт без всяких OVERLAPPED, и просто читайте из него 8 байтов - чтение заблокирует вашу программу, пока эти байты не придут. Не забудьте настроить порт - скорость и timeout'ы для чтения.


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


Новичок



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

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



Спасиба. Все пашет smile 
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.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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