Russian Qt Forum
Ноябрь 26, 2024, 17:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Событие Win32  (Прочитано 3212 раз)
alek
Гость
« : Декабрь 17, 2013, 12:56 »

Доброго времени суток!

Есть плата от которой приходит прерывание через событие Win32 API. В VS код на С++:
Код:
HANDLE hBcEvent;
hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
tmkdefevent(hBcEvent, TRUE);
bcputw(0, CW(RT_ADDR, RT_RECEIVE, wSubAddr, wLen)); //Запись командного слова в базу
bcputblk(1, awBuf, wLen); //Запись передаваемых данных
bcstartx(wBase, DATA_BC_RT); //Передача данных
/* Wait for an interrupt */
  switch (WaitForSingleObject(hBcEvent, 1000))
  {
  case WAIT_OBJECT_0:
    ResetEvent(hBcEvent);
    break;
  case WAIT_TIMEOUT:
    printf("Interrupt timeout error\n"); // qDebug() << "Interrupt timeout error" << endl;
    break;
  default:
    printf("Interrupt wait error\n"); // qDebug() << "Interrupt wait error" << endl;
    break;
  }
нормально работает.
Но на Qt такой код срабатывает только 1 раз. Дольше выдает "Interrupt timeout error". Подскажите пожалуйста в чем может быть проблема?
Вырезка из документации на плату:
Цитировать
В драйверах Windows работа с прерываниями осуществляется через механизм событий Win32. Прежде всего, процесс должен сообщить драйверу идентификатор (handle) используемого события для текущего выбранного ТМК через вызов функции tmkdefevent, которой передается в качестве первого параметра идентификатор события Win32, полученный из Win32 вызова CreateEvent:

void tmkdefevent(HANDLE hEvent, BOOL fEventSet);

Нулевое значение hEvent отменяет использование события. Значение параметра fEventSet равное TRUE указывает на необходимость установки события драйвером через вызовы SetEvent, а значение FALSE - через вызовы PulseEvent. Внимание! В текущей версии драйвера значение переменной fEventSet игнорируется (принимается равным TRUE).
« Последнее редактирование: Декабрь 17, 2013, 13:01 от alek » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Декабрь 17, 2013, 14:53 »

Qt здесь ни при чем, скорее всего tmkdefevent(hBcEvent, TRUE) нужно перевызывать каждый раз после срабатывания события (или таймаута или ошибки).

Можешь еще так попробовать:

Код
C++ (Qt)
 
class MtkEventProcessor
{
   Q_OBJECT
 
public:
   explicit MtkEventProcessor(QObject *parent = 0)
       : m_bcNotifier(new QWinEventNotifier(this))
   {
       connect(m_bcNotifier, SIGNAL(activated(HANDLE)), this, SLOT(handleEvent(HANDLE)));
 
       m_hBcEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset event type
       m_bcNotifier->setHandle(m_hBcEvent);
 
       tmkdefevent(m_hBcEvent, TRUE);
   }
 
   ~MtkEventProcessor()
   {
       m_bcNotifier->stop();
       CloseHandle(m_hBcEvent);        
   }
 
   void start()
   {
       m_bcNotifier->start();
   }
 
private slots:
   void handleEvent(HANDLE hEvent)
   {
       if (hEvent == m_hBcEvent) {
           // do something
       } else {
           // do something
       }
 
       tmkdefevent(hBcEvent, TRUE);
   }
 
private:
   HANDLE m_hBcEvent;
   QWinEventNotifier *m_bcNotifier;
}
 
int main()
{
   QCoreApplication app;
 
   MtkEventProcessor processor;
   processor.start();
 
   return app.exec();
}
 
 
« Последнее редактирование: Декабрь 17, 2013, 14:56 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
alek
Гость
« Ответ #2 : Декабрь 18, 2013, 08:40 »

Не знаю, может у меня руки кривые, но работать все равно не стало.
Записан
alek
Гость
« Ответ #3 : Декабрь 18, 2013, 13:21 »

В общем получилось, написал функцию инициализации устройства не там Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 22.