Esempio n. 1
0
        //----------------------------------------------------------------------------
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="portName">Имя COM-порта</param>
        /// <param name="baudRate">Скорость соединения</param>
        /// <param name="parity">Наличие паритета данных</param>
        /// <param name="dataBits">Количество бит в символе</param>
        /// <param name="stopBits">Количество стоп-бит</param>
        /// <param name="timeOut">Время таймаута ответа, в мсек</param>
        /// <param name="aroundDelay">Интервал временной задержки при широковещаетльном запросе, мсек</param>
        /// <param name="eventLogEnable">Разрешение вести журнал</param>
        /// <param name="filterLogMessage">Фильт сообщений записываемых в журнал</param>
        /// <param name="PathToLogFile">Путь к файлу журнала, если пустая строка, то по умолчанию в директории приложения</param>
        public ComPort(string portName, int baudRate, Parity parity,
                       int dataBits, StopBits stopBits, int timeOut, int aroundDelay,
                       Boolean eventLogEnable, TypeOfMessageLog filterLogMessage, String pathToLogFile)
        {
            _EventLogEnable   = eventLogEnable;
            _MaskOfMessageLog = filterLogMessage;
            if (pathToLogFile == String.Empty)
            {
                _PathToLogFile = Environment.CurrentDirectory + @"\SerialPort.log";
            }
            else
            {
                _PathToLogFile = pathToLogFile;
            }

            if (_EventLogEnable)
            {
                // Создаём журнал
                // По умолчанию ищем файл в папке приложения
                if (_PathToLogFile == String.Empty)
                {
                    // По умолчанию сохраняем в папку приложения
                    _PathToLogFile = Environment.CurrentDirectory + @"\datalink.log";
                }

                CreateLog();
            }
            else
            {
                Trace.Listeners.Clear();
            }

            // Таймер определения интервала между сообщениями
            _tmrInterFrameDelay = new System.Timers.Timer();
            // Если скорость передачи выше 19200 бит/сек, то устанавливаем
            // интервал 1.750mc, иначе 3,5*Tсимвола
            // !!! К сожалению следовать протоколу в винде не получается
            // Если ставить задержку меньше 20, пакет принимается не полностью
            // и выскакивает ошибка CRC.
            _tmrInterFrameDelay.Interval = 150; //20
            //if (Settings.BaudRate >= 19200)
            //{
            //    tmrInterFrameDelay.Interval = 1.750;
            //}
            //else
            //{
            //    tmrInterFrameDelay.Interval = Convert.ToDouble(1000 * 3.5 * 11 / Settings.BaudRate);
            //}
            _tmrInterFrameDelay.AutoReset = false;
            _tmrInterFrameDelay.Elapsed  += new ElapsedEventHandler(_tmrInterFrameDelay_Elapsed);
            _tmrInterFrameDelay.Stop();

            _serialPort =
                new System.IO.Ports.SerialPort(portName, baudRate, parity,
                                               dataBits, stopBits);

            // Настраиваем события от COM-порта
            _serialPort.ErrorReceived +=
                new SerialErrorReceivedEventHandler(ComPort_ErrorReceived);
            _serialPort.DataReceived +=
                new SerialDataReceivedEventHandler(ComPort_DataReceived);
            _serialPort.ReceivedBytesThreshold = 1;

            //_serialPort.ReadBufferSize = 512;

            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }

            _ValueTimeOut         = timeOut;
            _ValueTurnAroundDelay = aroundDelay;

            _timeOut = new EventWaitHandle(false,
                                           EventResetMode.AutoReset);

            _incomingBuffer = new List <byte>();
            _incomingBuffer.Clear();

            _transaction = TransactionType.Undefined;
        }
Esempio n. 2
0
        //----------------------------------------------------------------------------
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="portName">Имя COM-порта</param>
        /// <param name="baudRate">Скорость соединения</param>
        /// <param name="parity">Наличие паритета данных</param>
        /// <param name="dataBits">Количество бит в символе</param>
        /// <param name="stopBits">Количество стоп-бит</param>
        /// <param name="timeOut">Время таймаута ответа, в мсек</param>
        /// <param name="aroundDelay">Интервал временной задержки при широковещаетльном запросе, мсек</param>
        /// <param name="eventLogEnable">Разрешение вести журнал</param>
        /// <param name="filterLogMessage">Фильт сообщений записываемых в журнал</param>
        /// <param name="PathToLogFile">Путь к файлу журнала, если пустая строка, то по умолчанию в директории приложения</param>
        public ComPort(string portName, int baudRate, Parity parity,
            int dataBits, StopBits stopBits, int timeOut, int aroundDelay, 
            Boolean eventLogEnable, TypeOfMessageLog filterLogMessage, String pathToLogFile)
        {
            _EventLogEnable = eventLogEnable;
            _MaskOfMessageLog = filterLogMessage;
            if (pathToLogFile == String.Empty)
            {
                _PathToLogFile = Environment.CurrentDirectory + @"\SerialPort.log";
            }
            else
            {
                _PathToLogFile = pathToLogFile;
            }

            if (_EventLogEnable)
            {
                // Создаём журнал
                // По умолчанию ищем файл в папке приложения
                if (_PathToLogFile == String.Empty)
                {
                    // По умолчанию сохраняем в папку приложения
                    _PathToLogFile = Environment.CurrentDirectory + @"\datalink.log";
                }

                CreateLog();
            }
            else
            {
                Trace.Listeners.Clear();
            }

            // Таймер определения интервала между сообщениями
            _tmrInterFrameDelay = new System.Timers.Timer();
            // Если скорость передачи выше 19200 бит/сек, то устанавливаем
            // интервал 1.750mc, иначе 3,5*Tсимвола
            // !!! К сожалению следовать протоколу в винде не получается
            // Если ставить задержку меньше 20, пакет принимается не полностью
            // и выскакивает ошибка CRC.
            _tmrInterFrameDelay.Interval = 150; //20
            //if (Settings.BaudRate >= 19200)
            //{
            //    tmrInterFrameDelay.Interval = 1.750;
            //}
            //else
            //{
            //    tmrInterFrameDelay.Interval = Convert.ToDouble(1000 * 3.5 * 11 / Settings.BaudRate);
            //}
            _tmrInterFrameDelay.AutoReset = false;
            _tmrInterFrameDelay.Elapsed += new ElapsedEventHandler(_tmrInterFrameDelay_Elapsed);
            _tmrInterFrameDelay.Stop();

            _serialPort = 
                new System.IO.Ports.SerialPort(portName, baudRate, parity,
                dataBits, stopBits);

            // Настраиваем события от COM-порта
            _serialPort.ErrorReceived += 
                new SerialErrorReceivedEventHandler(ComPort_ErrorReceived);
            _serialPort.DataReceived += 
                new SerialDataReceivedEventHandler(ComPort_DataReceived);
            _serialPort.ReceivedBytesThreshold = 1;

            //_serialPort.ReadBufferSize = 512;
            
            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }

            _ValueTimeOut = timeOut;
            _ValueTurnAroundDelay = aroundDelay;
                    
            _timeOut = new EventWaitHandle(false, 
                EventResetMode.AutoReset);

            _incomingBuffer = new List<byte>();
            _incomingBuffer.Clear();

            _transaction = TransactionType.Undefined;
        }