예제 #1
0
        /// <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="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int maxCount,
                                             byte stopCode, int timeout, bool wait, 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 + "): " + KPUtils.BytesToHex(buffer, index, readCnt);

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

            return(readCnt);
        }
예제 #2
0
        /// <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="logText">Строка для вывода в журнал</param>
        /// <returns>Количество считанных байт</returns>
        public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int count,
                                             int timeout, bool wait, 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 + "): " +
                          KPUtils.BytesToHex(buffer, index, readCnt);

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

            return(readCnt);
        }
예제 #3
0
 /// <summary>
 /// Записать данные в последовательный порт
 /// </summary>
 /// <param name="serialPort">Последовательный порт</param>
 /// <param name="buffer">Буфер передаваемых данных</param>
 /// <param name="index">Начальный индекс в буфере</param>
 /// <param name="count">Количество передаваемых байт</param>
 /// <param name="logText">Строка для вывода в журнал</param>
 public static void WriteToSerialPort(SerialPort serialPort, byte[] buffer, int index, int count, out string logText)
 {
     try
     {
         if (serialPort == null)
         {
             logText = WriteDataImpossible;
         }
         else
         {
             serialPort.DiscardInBuffer();
             serialPort.DiscardOutBuffer();
             serialPort.Write(buffer, index, count);
             logText = SendNotation + " (" + count + "): " + KPUtils.BytesToHex(buffer, index, count);
         }
     }
     catch (Exception ex)
     {
         logText = (Localization.UseRussian ?
                    "Ошибка при отправке данных: " : "Error sending data: ") + ex.Message;
     }
 }