/// <summary> /// Открывает коммункационный порт /// </summary> public void Open() { // если порт открыт if (IsOpen) // закрываем его Close(); // открываем порт _handle = WinApi.CreateFile( String.Format(_portNameFormat, _portName), (uint)(DESIRED_ACCESS.GENERIC_READ | DESIRED_ACCESS.GENERIC_WRITE), 0, IntPtr.Zero, CREATION_DISPOSITION.OPEN_EXISTING, 0, IntPtr.Zero); // проверяем результат открытия WinApi.Win32Check(!_handle.IsInvalid); if (IsSerial) { // читаем настройки порта WinApi.Win32Check(WinApi.GetCommState(_handle, ref _dcb)); // инициализируем настройки значениями по умолчанию _dcb.BaudRate = _baudRate; _dcb.ByteSize = _dataBits; _dcb.fOutxDsrFlow = _dsrFlow ? 1U : 0U; _dcb.Parity = (byte)_parity; _dcb.StopBits = (byte)_stopBits; // если есть обработчик события if (SetCommStateEvent != null) { CommStateEventArgs e = new CommStateEventArgs(_dcb); SetCommStateEvent(this, e); if (e.Handled) _dcb = e.DCB; } // задаем настройки WinApi.Win32Check(WinApi.SetCommState(_handle, ref _dcb)); // устанавливаем маску событий WinApi.SetCommMask(_handle, (uint)CommEvents.EV_TXEMPTY); } }
/// <summary> /// Создает экземпляр класса /// </summary> /// <param name="dcb">Управляющая структура порта</param> public CommStateEventArgs(DCB dcb) : base() { _dcb = dcb; _handled = false; }
/// <summary> /// Создает экземпляр класса /// </summary> /// <param name="dcb">Управляющая структура порта</param> public CommStateEventArgs(DCB dcb) : base() { _dcb = dcb; _handled = false; }
internal extern static Boolean SetCommState( SafeFileHandle hFile, ref DCB lpDCB );