public static int OpenComPort(ref UCView.COMPORTPARAM ComParam) { string szPort = "\\\\.\\COM" + (ComParam.nPort + 1); int hComm = WinApi.CreateFile(szPort, WinApi.GENERIC_READ | WinApi.GENERIC_WRITE, 0, 0, WinApi.OPEN_EXISTING, WinApi.FILE_ATTRIBUTE_NORMAL, 0); if (WinApi.INVALID_HANDLE_VALUE == hComm) { return(WinApi.INVALID_HANDLE_VALUE); } //Setup COM port. WinApi.SetupComm(hComm, COM_BUFF_SIZE, COM_BUFF_SIZE); byte stopBits = 0; switch (ComParam.nStopBits) { default: case 1: stopBits = WinApi.ONESTOPBIT; break; case 2: stopBits = WinApi.TWOSTOPBITS; break; } WinApi.DCB dcb = new WinApi.DCB(); WinApi.GetCommState(hComm, ref dcb); dcb.BaudRate = (int)ComParam.lBaudRate; dcb.ByteSize = (byte)ComParam.nDataBits; dcb.StopBits = (byte)stopBits; dcb.Parity = (byte)ComParam.nParity; //0==NOPARITY 1==ODDPARITY 2==EVENPARITY //3==MARKPARITY 4==SPACEPARITY if (!WinApi.SetCommState(hComm, ref dcb)) { WinApi.CloseHandle(hComm); return(WinApi.INVALID_HANDLE_VALUE); } WinApi.SetCommMask(hComm, WinApi.EV_RXFLAG | WinApi.EV_BREAK); //Setup COM timeout WinApi.PurgeComm(hComm, WinApi.PURGE_TXABORT | WinApi.PURGE_RXABORT | WinApi.PURGE_TXCLEAR | WinApi.PURGE_RXCLEAR); //NOTE::dentifies the communications resource. The CreateFile function returns this handle. // set up for Non_blocking IO. WinApi.COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; // CBR_9600 is approximately 1byte/ms. For our purposes, allow // double the expected time per character for a fudge factor. if (dcb.BaudRate > 9600) { //2*CBR_9600/BAUDRATE(npTTYInfo); CommTimeOuts.WriteTotalTimeoutMultiplier = 10; } else { CommTimeOuts.WriteTotalTimeoutMultiplier = 50; } CommTimeOuts.WriteTotalTimeoutConstant = 0; WinApi.SetCommTimeouts(hComm, ref CommTimeOuts); return(hComm); }
public static extern bool SetCommState(int hFile, ref WinApi.DCB lpDCB);