Название: Асинхронный Ввод/Вывод Win32 Отправлено: 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) почему если в буффере чтения пусто программа на чтении падает, вроде же выставлен тайм-аут ? (зависает в ожидании даных) так же буду очень признателен за хорошие ссылки или примеры помогите кто знает плиз Название: Асинхронный Ввод/Вывод Win32 Отправлено: WW от Май 15, 2007, 14:22 вначале надо что-нить записать в порт, а потом читать.
Название: Асинхронный Ввод/Вывод Win32 Отправлено: TeAnton от Июнь 05, 2007, 22:16 Нужно настроить порт. Задать скорость, количество бит в байте, четность, размер стопового бита, задать таймауты, размер буферов приема/передачи.
SetupComm - настройка размера буферов приема/передачи; SetCommState - скорость, количество бит в байте, четность, размер стопового бита; SetCommTimeouts - таймауты. Кстати, установив таймауты, не надо будет заморачиваться с WaitForSignaled... и асинхронным чтанием из порта и записью в порт. |