コード例 #1
0
ファイル: KPUtils.cs プロジェクト: southasia/scada
        /// <summary>
        /// Считать данные из последовательного порта
        /// </summary>
        /// <param name="serialPort">Последовательный порт</param>
        /// <param name="buffer">Буфер принимаемых данных</param>
        /// <param name="index">Начальный индекс в буфере</param>
        /// <param name="maxCount">Максимальное количество принимаемых байт</param>
        /// <param name="stopCode">Байт, означающий окончание считывания данных</param>
        /// <param name="timeout">Таймаут чтения данных, мс</param>
        /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param>
        /// <param name="logFormat">Формат вывода данных в журнал</param>
        /// <param name="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int maxCount,
                                             byte stopCode, int timeout, bool wait, SerialLogFormat logFormat, out string logText)
        {
            int readCnt = 0;

            if (serialPort == null)
            {
                logText = KPUtils.ReadDataImpossible;
            }
            else
            {
                DateTime nowDT   = DateTime.Now;
                DateTime startDT = nowDT;
                DateTime stopDT  = startDT.AddMilliseconds(timeout);

                bool stop   = false;
                int  curInd = index;
                serialPort.ReadTimeout = 0;

                while (readCnt <= maxCount && !stop && startDT <= nowDT && nowDT <= stopDT)
                {
                    bool readOk;
                    try { readOk = serialPort.Read(buffer, curInd, 1) > 0; }
                    catch { readOk = false; }

                    if (readOk)
                    {
                        stop = buffer[curInd] == stopCode;
                        curInd++;
                        readCnt++;
                    }
                    else
                    {
                        Thread.Sleep(100); // накопление входных данных в буфере порта
                    }

                    nowDT = DateTime.Now;
                }

                logText = ReceiveNotation + " (" + readCnt + "): " + (logFormat == SerialLogFormat.Hex ?
                                                                      BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt));

                if (wait && startDT <= nowDT)
                {
                    int delay = (int)(stopDT - nowDT).TotalMilliseconds;
                    if (delay > 0)
                    {
                        Thread.Sleep(delay);
                    }
                }
            }

            return(readCnt);
        }
コード例 #2
0
ファイル: KPUtils.cs プロジェクト: southasia/scada
        /// <summary>
        /// Считать данные из последовательного порта
        /// </summary>
        /// <param name="serialPort">Последовательный порт</param>
        /// <param name="buffer">Буфер принимаемых данных</param>
        /// <param name="index">Начальный индекс в буфере</param>
        /// <param name="count">Количество принимаемых байт</param>
        /// <param name="timeout">Таймаут чтения данных, мс</param>
        /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param>
        /// <param name="logFormat">Формат вывода данных в журнал</param>
        /// <param name="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int count,
                                             int timeout, bool wait, SerialLogFormat logFormat, out string logText)
        {
            int readCnt = 0;

            if (serialPort == null)
            {
                logText = ReadDataImpossible;
            }
            else
            {
                // данный способ чтения данных необходим для избежания исключения
                // System.ObjectDisposedException при прерывании потока линии связи
                DateTime nowDT   = DateTime.Now;
                DateTime startDT = nowDT;
                DateTime stopDT  = startDT.AddMilliseconds(timeout);
                serialPort.ReadTimeout = 0;

                while (readCnt < count && startDT <= nowDT && nowDT <= stopDT)
                {
                    try { readCnt += serialPort.Read(buffer, index + readCnt, count - readCnt); }
                    catch { /*The operation has timed out*/ }

                    if (readCnt < count)
                    {
                        Thread.Sleep(100); // накопление входных данных в буфере порта
                    }
                    nowDT = DateTime.Now;
                }

                logText = ReceiveNotation + " (" + readCnt + "/" + count + "): " + (logFormat == SerialLogFormat.Hex ?
                                                                                    BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt));

                if (wait && startDT <= nowDT)
                {
                    int delay = (int)(stopDT - nowDT).TotalMilliseconds;
                    if (delay > 0)
                    {
                        Thread.Sleep(delay);
                    }
                }
            }

            return(readCnt);
        }
コード例 #3
0
ファイル: KPUtils.cs プロジェクト: southasia/scada
 /// <summary>
 /// Записать данные в последовательный порт
 /// </summary>
 /// <param name="serialPort">Последовательный порт</param>
 /// <param name="buffer">Буфер передаваемых данных</param>
 /// <param name="index">Начальный индекс в буфере</param>
 /// <param name="count">Количество передаваемых байт</param>
 /// <param name="logFormat">Формат вывода данных в журнал</param>
 /// <param name="logText">Строка для вывода в журнал</param>
 public static void WriteToSerialPort(SerialPort serialPort, byte[] buffer, int index, int count,
                                      SerialLogFormat logFormat, out string logText)
 {
     try
     {
         if (serialPort == null)
         {
             logText = WriteDataImpossible;
         }
         else
         {
             serialPort.DiscardInBuffer();
             serialPort.DiscardOutBuffer();
             serialPort.Write(buffer, index, count);
             logText = SendNotation + " (" + count + "): " + (logFormat == SerialLogFormat.Hex ?
                                                              BytesToHex(buffer, index, count) : BytesToString(buffer, index, count));
         }
     }
     catch (Exception ex)
     {
         logText = (Localization.UseRussian ?
                    "Ошибка при отправке данных: " : "Error sending data: ") + ex.Message;
     }
 }
コード例 #4
0
ファイル: KPUtils.cs プロジェクト: iyus/scada
 /// <summary>
 /// Записать данные в последовательный порт
 /// </summary>
 /// <param name="serialPort">Последовательный порт</param>
 /// <param name="buffer">Буфер передаваемых данных</param>
 /// <param name="index">Начальный индекс в буфере</param>
 /// <param name="count">Количество передаваемых байт</param>
 /// <param name="logFormat">Формат вывода данных в журнал</param>
 /// <param name="logText">Строка для вывода в журнал</param>
 public static void WriteToSerialPort(SerialPort serialPort, byte[] buffer, int index, int count, 
     SerialLogFormat logFormat, out string logText)
 {
     try
     {
         if (serialPort == null)
         {
             logText = WriteDataImpossible;
         }
         else
         {
             serialPort.DiscardInBuffer();
             serialPort.DiscardOutBuffer();
             serialPort.Write(buffer, index, count);
             logText = SendNotation + " (" + count + "): " + (logFormat == SerialLogFormat.Hex ?
                 BytesToHex(buffer, index, count) : BytesToString(buffer, index, count));
         }
     }
     catch (Exception ex)
     {
         logText = (Localization.UseRussian ?
             "Ошибка при отправке данных: " : "Error sending data: ") + ex.Message;
     }
 }
コード例 #5
0
ファイル: KPUtils.cs プロジェクト: iyus/scada
        /// <summary>
        /// Считать данные из последовательного порта
        /// </summary>
        /// <param name="serialPort">Последовательный порт</param>
        /// <param name="buffer">Буфер принимаемых данных</param>
        /// <param name="index">Начальный индекс в буфере</param>
        /// <param name="maxCount">Максимальное количество принимаемых байт</param>
        /// <param name="stopCode">Байт, означающий окончание считывания данных</param>
        /// <param name="timeout">Таймаут чтения данных, мс</param>
        /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param>
        /// <param name="logFormat">Формат вывода данных в журнал</param>
        /// <param name="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int maxCount,
            byte stopCode, int timeout, bool wait, SerialLogFormat logFormat, out string logText)
        {
            int readCnt = 0;

            if (serialPort == null)
            {
                logText = KPUtils.ReadDataImpossible;
            }
            else
            {
                DateTime nowDT = DateTime.Now;
                DateTime startDT = nowDT;
                DateTime stopDT = startDT.AddMilliseconds(timeout);

                bool stop = false;
                int curInd = index;
                serialPort.ReadTimeout = 0;

                while (readCnt <= maxCount && !stop && startDT <= nowDT && nowDT <= stopDT)
                {
                    bool readOk;
                    try { readOk = serialPort.Read(buffer, curInd, 1) > 0; }
                    catch { readOk = false; }

                    if (readOk)
                    {
                        stop = buffer[curInd] == stopCode;
                        curInd++;
                        readCnt++;
                    }
                    else
                    {
                        Thread.Sleep(100); // накопление входных данных в буфере порта
                    }

                    nowDT = DateTime.Now;
                }

                logText = ReceiveNotation + " (" + readCnt + "): " + (logFormat == SerialLogFormat.Hex ?
                        BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt));

                if (wait && startDT <= nowDT)
                {
                    int delay = (int)(stopDT - nowDT).TotalMilliseconds;
                    if (delay > 0)
                        Thread.Sleep(delay);
                }
            }

            return readCnt;
        }
コード例 #6
0
ファイル: KPUtils.cs プロジェクト: iyus/scada
        /// <summary>
        /// Считать данные из последовательного порта
        /// </summary>
        /// <param name="serialPort">Последовательный порт</param>
        /// <param name="buffer">Буфер принимаемых данных</param>
        /// <param name="index">Начальный индекс в буфере</param>
        /// <param name="count">Количество принимаемых байт</param>
        /// <param name="timeout">Таймаут чтения данных, мс</param>
        /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param>
        /// <param name="logFormat">Формат вывода данных в журнал</param>
        /// <param name="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int count,
            int timeout, bool wait, SerialLogFormat logFormat, out string logText)
        {
            int readCnt = 0;

            if (serialPort == null)
            {
                logText = ReadDataImpossible;
            }
            else
            {
                // данный способ чтения данных необходим для избежания исключения
                // System.ObjectDisposedException при прерывании потока линии связи
                DateTime nowDT = DateTime.Now;
                DateTime startDT = nowDT;
                DateTime stopDT = startDT.AddMilliseconds(timeout);
                serialPort.ReadTimeout = 0;

                while (readCnt < count && startDT <= nowDT && nowDT <= stopDT)
                {
                    try { readCnt += serialPort.Read(buffer, index + readCnt, count - readCnt); }
                    catch { /*The operation has timed out*/ }

                    if (readCnt < count)
                        Thread.Sleep(100); // накопление входных данных в буфере порта

                    nowDT = DateTime.Now;
                }

                logText = ReceiveNotation + " (" + readCnt + "/" + count + "): " + (logFormat == SerialLogFormat.Hex ?
                        BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt));

                if (wait && startDT <= nowDT)
                {
                    int delay = (int)(stopDT - nowDT).TotalMilliseconds;
                    if (delay > 0)
                        Thread.Sleep(delay);
                }
            }

            return readCnt;
        }