Последовательный порт и GSM роутер - C#
Формулировка задачи:
Приветствую всех!, помогите пожалуйста с такой проблемой.
Имеется GSM роутер, соединенный с ПК через COMпорт 3.
Необходимо сделать так, чтобы по прибытии SMS сообщения на GSM роутер, оно сразу же считывалось ПК.
Была идея сделать подобную функцию через таймер:
таймер каждую секунду генерирует событие, которое обрабатывается путем инициализации чтения памяти GSM роутера. К сожалению практика показала, что такой подход серьезно отнимает ресурсы ПК, медленный и неэффективный. Поэтому, возникла здравая мысль запускать процедуру чтения памяти только когда GSM роутер подает соответствующую команду о прибытии нового СМС.
Возникла идея реализовать этот простой механизм через цикл:
По факту функция просто не выводит информацию.
В Hyperterminale данная процедура сработала правильно:
Скажите, возможно ли как-то решить эту проблему без применения таймера?
Заранее спасибо!
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;
}Решение задачи: «Последовательный порт и 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;
}
}