예제 #1
0
        /// <summary>
        /// Отправка команды
        /// </summary>
        /// <param name="command">Команда</param>
        /// <returns>Ответ</returns>
        public string Send(string command)
        {
            // добавляем завершающий символ к команде
            string preparedCommand = string.Concat(command, "\r");

            // пишем команду в порт
            _port.ClearError();
            _port.DiscardBuffers();
            _port.Write(_encoding.GetBytes(preparedCommand));

            // засекаем время
            DateTime fixedTime = DateTime.Now;

            // буфер для хранения ответа
            List <byte> answer = new List <byte>();
            // очередной байт ответа
            byte nextByte = 0;

            // временный буфер данных
            byte[] buf = new byte[1024];

            // читаем ответ
            do
            {
                // читаем очередную порцию данных и з порта
                Array.Clear(buf, 0, buf.Length);
                int bytesRead = _port.Read(buf, 0, buf.Length);

                // разбираем полученные данные
                for (int i = 0; i < bytesRead; i++)
                {
                    nextByte = buf[i];

                    if (IsStopByte(nextByte))
                    {
                        // стоповый байт
                        break;
                    }

                    if (nextByte >= 0x20)
                    {
                        // читаемый символ или его часть
                        answer.Add(nextByte);
                    }
                }

                if (IsStopByte(nextByte))
                {
                    break;
                }
                else
                {
                    TimeSpan elapsedTime = DateTime.Now - fixedTime;
                    if (elapsedTime.TotalMilliseconds >= _receiveTimeout)
                    {
                        throw new TimeoutException("Время ожидания ответа истекло");
                    }
                }
            }while (!IsStopByte(nextByte));

            // возвращаем ответ в виде строки в текущей кодировке
            return(_encoding.GetString(answer.ToArray()));
        }