Пример #1
0
        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);
        }
Пример #2
0
 public static extern bool SetCommState(int hFile, ref WinApi.DCB lpDCB);