Последовательный порт и GSM роутер - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую всех!, помогите пожалуйста с такой проблемой. Имеется GSM роутер, соединенный с ПК через COMпорт 3. Необходимо сделать так, чтобы по прибытии SMS сообщения на GSM роутер, оно сразу же считывалось ПК. Была идея сделать подобную функцию через таймер: таймер каждую секунду генерирует событие, которое обрабатывается путем инициализации чтения памяти GSM роутера. К сожалению практика показала, что такой подход серьезно отнимает ресурсы ПК, медленный и неэффективный. Поэтому, возникла здравая мысль запускать процедуру чтения памяти только когда GSM роутер подает соответствующую команду о прибытии нового СМС. Возникла идея реализовать этот простой механизм через цикл:
 public string ListenModem(SerialPort sPort)
        {
            string sText = null;
            do
            {
                System.Threading.Thread.Sleep(100);
                sText = ReadPort(sPort);
            }
            while (sText == null);
            return sText;
        }
 
private string ReadPort(SerialPort sPort)
        {
            //подождем 150 милисекунд
            System.Threading.Thread.Sleep(150);
            string res = sPort.ReadExisting();
 
            return res;
        }
По факту функция просто не выводит информацию. В Hyperterminale данная процедура сработала правильно: Скажите, возможно ли как-то решить эту проблему без применения таймера? Заранее спасибо!

Решение задачи: «Последовательный порт и GSM роутер»

textual
Листинг программы
private void button1_Click(object sender, EventArgs e)
        {
            GSMRouter Modem = new GSMRouter();
 
            serialPort.BaudRate = 9600;
            serialPort.Parity = Parity.None;
            serialPort.PortName = "COM3";
            serialPort.StopBits = StopBits.One;
            serialPort.DataBits = 8;
            serialPort.Open();
            Modem.TuneRouter(serialPort);
            
            textSignal.Text = Modem.ListenModem(serialPort);
            
        }
Class GSMRouter
{
 public string ListenModem(SerialPort sPort)
        {
            if (sPort.IsOpen)
            {
                string Res = ReadPort(sPort); ;
                while (Res == null)
                {
                    System.Threading.Thread.Sleep(100);
                    Res = ReadPort(sPort);
                }
                return Res;
 
            }
            else
            { return "Ошибка открытия порта"; }
          
            
        }
 
 private string ReadPort(SerialPort sPort)
        {
            //подождем 500 милисекунд
 
            System.Threading.Thread.Sleep(150);
            string res = sPort.ReadExisting();
            if (res.Length != 0)
            {
                return res;
            }
            else
                return null;
        }
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.857 из 5
Похожие ответы