ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
873836 Топик полностью
IBAH (27.09.2018 12:42, просмотров: 115) ответил Хитрый Китаец на Значит, так: если не использован флаг FILE_FLAG_OVERLAPPED, то ReadFile или WriteFile блокируются до исполнения запроса или таймаута и вызывать их нужно без дискриптора OVERLAPPED со значением указателя NULL. Если флаг используется, то они
Тут читать, тут не читать, тут рыбу заворачивали... В конце концов, методом научного тыка, так и сделал, кажись не ошибся   HANDLE handle; COMMTIMEOUTS CommTimeOuts; DCB dcb; COMSTAT ComState; OVERLAPPED Overlap; // открытие порта // возвращает TRUE если порт открылся нормально boolean ComPortOpen(char* port, DWORD BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits) { //открываем порт handle = CreateFile ( port,// имя файла GENERIC_READ | GENERIC_WRITE, // режим доступа 0, // совместный доступ NULL, //SD (дескр. защиты) OPEN_EXISTING, //как действовать NULL,//FILE_FLAG_OVERLAPPED, // атрибуты файла NULL //дескр.шаблона файла ); if(handle == INVALID_HANDLE_VALUE) {return FALSE; } //размер буфера обмена if(!SetupComm(handle, SizeBuffer, SizeBuffer)) {return FALSE; } //инициализируем структуру настроек порта if(!GetCommState(handle, &dcb)) {return FALSE; } //заполняем структуру настроек порта dcb.BaudRate = BaudRate; dcb.fBinary = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fAbortOnError = FALSE; dcb.ByteSize = ByteSize; dcb.Parity = Parity; dcb.StopBits = StopBits; //настройка параметров порта if(!SetCommState(handle, &dcb)){return FALSE; } //инициализируем структуру таймаутов порта if(!GetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; } //заполняем структуру таймаутов порта CommTimeOuts.ReadIntervalTimeout = 0; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 0; //настройка таймаутов порта if(!SetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; } //Очистка буфера приема ComPortResetRB(); //очистка буфера передачи ComPortResetWB(); //The End return TRUE; } //закрытие порта void ComPortClose(void) { CloseHandle(handle); } // очистка буфера приема void ComPortResetRB(void) { PurgeComm(handle, PURGE_RXCLEAR); } // очистка буфера передачи void ComPortResetWB(void) { PurgeComm(handle, PURGE_TXCLEAR); } // считать число принятых символов в буфере приема // (еще не считанных функцией Read) unsigned short ComPortGetWBSize(void) { unsigned long temp; ClearCommError(handle, &temp, &ComState); return (unsigned short)ComState.cbOutQue; } // считать число еще не переданных символов в буфере передачи unsigned short ComPortGetRBSize(void) { unsigned long temp; ClearCommError(handle, &temp, &ComState); return (unsigned short)ComState.cbInQue; } //прочитать символ из порта без ожидания unsigned char ComPortInKey(void) { unsigned char tmp; unsigned long tmp2; ClearCommError(handle, &tmp2, &ComState); if(ComPortGetRBSize()==0)return 0; ReadFile(handle,&tmp, 1, &tmp2, NULL); return tmp; } //записать символ в порт void ComPortPut(unsigned char a) { unsigned long tmp2; ClearCommError(handle, &tmp2, &ComState); WriteFile(handle, &a, 1, &tmp2, NULL); }