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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Асинхронный Ввод/Вывод Win32  (Прочитано 5497 раз)
dread
Гость
« : Март 30, 2007, 05:32 »

Здравствуйте!

Помогите кто знает в чем ошибка или проблема...

Дело в том что я пишу код для работы с КОМ портом под форточками.

Открытие осуществляю:

         CUR_PORT=CreateFile(L"COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
         if (CUR_PORT!=INVALID_HANDLE_VALUE)
         {   STATUS = OPENED;
         return OK;
         } else
         {
            STATUS = CLOSED;
            return ERROR;
         }

Запись:

      char buffer[4];
      DWORD dwWrite, dwWait;
      OVERLAPPED Sync = {0};

      Sync.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
      if(Sync.hEvent==NULL) return ERROR;

      buffer[0] = BUF0;
      buffer[1] = BUF1;
      buffer[2] = BUF2;
      buffer[3] = BUF3;

      if(!WriteFile(CUR_PORT, buffer, 4, &dwWrite, &Sync)) {
         if(GetLastError() != ERROR_IO_PENDING)
            return ERROR;
         else {
            dwWait = WaitForSingleObject(Sync.hEvent, 10);
            switch(dwWait) {
            case WAIT_OBJECT_0:
               if(!GetOverlappedResult(CUR_PORT, &Sync, &dwWrite, FALSE)) return ERROR;
               break;
            default:
               return ERROR;
               break;
            }
         }
      }
      return OK;

И чтение:

      DWORD dwRead, dwWait;
      OVERLAPPED Sync = {0};

      char DATA[2];

      Sync.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
      if(Sync.hEvent==NULL) return ERROR;

      if(!ReadFile(CUR_PORT, DATA, 1, &dwRead, &Sync)) {
         if(GetLastError() != ERROR_IO_PENDING) qWarning("read error 1");
         else  {
            dwWait = WaitForSingleObject(Sync.hEvent, TIMEOUT);
            switch (dwWait) {
     case WAIT_OBJECT_0:
        if(!GetOverlappedResult(CUR_PORT, &Sync, &dwRead, FALSE))
           qWarning("read error 2");
        else
           return DATA[0];
        break;

     case WAIT_TIMEOUT:
        break;

     default:
        qWarning("read error 3");
        break;
            }
         }
      }
      else
      {
      DATA[1] = 0;
      qWarning("OK -> %X %X",DATA[0],DATA[1]);
      return DATA[0];
      }
      qWarning("close");
         CloseHandle(Sync.hEvent);

Возникло два вопроса:

1) если просто выполнить открытие порта - ничего не работает
работает если предварительно воспользоваться любой программой для работы с этим самым портом - после все открываеться и работает отлично
в обоих случаях open возвращает положительное значение - но ничего не работает без предварительного откр/закр сторонней программой... чего не хватает мой open???

2) почему если в буффере чтения пусто программа на чтении падает, вроде же выставлен тайм-аут ? (зависает в ожидании даных)

так же буду очень признателен за хорошие ссылки или примеры

помогите кто знает плиз
Записан
WW
Гость
« Ответ #1 : Май 15, 2007, 14:22 »

вначале надо что-нить записать в порт, а потом читать.
Записан
TeAnton
Гость
« Ответ #2 : Июнь 05, 2007, 22:16 »

Нужно настроить порт. Задать скорость, количество бит в байте, четность, размер стопового бита, задать таймауты, размер буферов приема/передачи.

SetupComm - настройка размера буферов приема/передачи;
SetCommState - скорость, количество бит в байте, четность, размер стопового бита;
SetCommTimeouts - таймауты.

Кстати, установив таймауты, не надо будет заморачиваться с WaitForSignaled... и асинхронным чтанием из порта и записью в порт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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