//---------------------------------------------------------------------------- /// <summary> /// Устанавливает режим транзакции запрос-ответ /// </summary> private void StartTransaction( Modbus.OSIModel.Transaction.TransactionType type) { if (_transaction == TransactionType.Undefined) { if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information) { Trace.TraceInformation("{0}: Поток ID: {1} : Старт транзакции", DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId); } //_incomingBuffer.Clear(); _serialPort.DiscardInBuffer(); _serialPort.DiscardOutBuffer(); _transaction = type; _error = RequestError.NoError; } else { if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information) { Trace.TraceError("{0}: Поток ID: {1} : Попытка начать новую транзакцию во время текущей транзакции", DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId); } throw new Exception("Попытка начать новую транзакцию во время текущей транзакции"); } return; }
//---------------------------------------------------------------------------- /// <summary> /// Устанавливает режим ожидания. /// </summary> private void StopTransaction() { if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information) { Trace.TraceInformation("{0}: Поток ID: {1} : Окончание транзакции", DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId); } _serialPort.DiscardOutBuffer(); _serialPort.DiscardInBuffer(); _transaction = TransactionType.Undefined; return; }
//---------------------------------------------------------------------------- /// <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; }
//---------------------------------------------------------------------------- /// <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; }