Как слушать лог порта?

myaso
Offline
Зарегистрирован: 31.01.2020

Доброго времени. Не совсем в тему, но тут должны разбираться.

Ситуация такая. Есть 2 кода на C#.

нужно выполнять такие действия: Отправка смс1, отправка смс2, получать входящую смс(После отправки второй смс).

Первый код: включает оповещение о входящем смс, отправка смс1.

Второй код(ниже прикрепил, прошу обратить внимание на него): удаляет все сообщения из памяти, отправка смс2.

При входящей смс в логе должно быть указано +CMT: ...., но не знаю как этого момента дождаться. Может существует какой либо вариант слушать com порт и выводить строку в переменную после оповещения о входящей смс?

Пока что это делаю увеличив таймаут System.Threading.Thread.Sleep(35000); , в ответ получаю 


AT+CMGD=1,4

OK
AT+CMGS="79111111111"

> test
> 

+CMGS: 42

OK

+CMT: "1234",,"2020/01/31 20:55:39+12",208,100,0,8,"+79168960438",145,224
текст смс.

 

SerialPort serial_port = new SerialPort();

serial_port.BaudRate =115200;
serial_port.DataBits = 8;
serial_port.StopBits = StopBits.One;
serial_port.Parity = Parity.None;
serial_port.Handshake = Handshake.None;
serial_port.RtsEnable = true;
serial_port.ReadTimeout = 500;
serial_port.WriteTimeout = 500;
// ----

string response = String.Empty;

serial_port.PortName = "COM15"; //назначаем конкретный COM порт
if (!serial_port.IsOpen) { //если порт НЕ открыт, то...
    try {
        serial_port.Open(); //... пробуем его открыть
    }
    catch (Exception e) {return "упс!";}
      
    if (serial_port.IsOpen)
		System.Threading.Thread.Sleep(500);
		serial_port.Write("AT+CMGD=1,4" + "\r\n");
        System.Threading.Thread.Sleep(500);
		serial_port.Write("AT+CMGS=79111111111\r\n");
	    System.Threading.Thread.Sleep(500);
		serial_port.Write("test" + char.ConvertFromUtf32(26) + "\r\n");
		System.Threading.Thread.Sleep(35000);
		try {
            response = serial_port.ReadExisting();
        }
        catch (Exception e) {return "упс №2"; }
          
        if (response != String.Empty) {
            project.Variables["response"].Value = response;
        }
      }        
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

+CMT приходит на любое входящее СМС. Посему единственно правильным методом будет написание finite state machine для отслеживания и анализа того, что приходит в порт, а не ожидание чуда с помощью Thread.Sleep.

myaso
Offline
Зарегистрирован: 31.01.2020

DIYMan пишет:

+CMT приходит на любое входящее СМС. Посему единственно правильным методом будет написание finite state machine для отслеживания и анализа того, что приходит в порт, а не ожидание чуда с помощью Thread.Sleep.

Вот да, именно это и нужно. А не подскажите точную функцию этого? Не могу найти в гугле

И правильно ли понимаю - После отправки смс2 производим действия (finite state machine) - он просто не закрывает лог и анализирует его, если имеется +CMT, записать в переменную ответ и продолжать работать дальше(закрытие порта и т.п.). Тут ещё вся сложность в том, что все действия выполняются в программе автоматизации действий(т.е. отдельные кубики - отправка смс;отправка смс;получение смс;)

C# не знаю, вот пытаюсь кое как разобраться со своей задачей.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

myaso пишет:

C# не знаю, вот пытаюсь кое как разобраться со своей задачей.

Теория конечных автоматов не привязана к языку программирования ;) В общем случае - ваша задача решается при помощи конечного автомата (finite state machine). Объяснять "на пальцах" от и до - очень долго и нудно, вам проще почитать теорию.

Для того, чтобы получить необходимый результат, первое, что нужно сделать - это изложить алгоритм русскими словами на бумаге. Затем - формализовывать его на конкретном языке программирования. Ваш алгоритм выглядит в псевдокоде примерно так:


модем.записать("ATE0");


строка отМодема = ""

цикл

	символ сим = модем.получитьСимвол()
	если сим не пустой то
		если сим равно переводСтроки то
			анализироватьОтветОтМодема(отМодема)
			отМодема = ""
			выйтиИзЦикла
		иначе
			отМодема += сим
		конецЕсли
	конецЕсли

конецЦикла

Ну а все дальнейшие действия зависят от состояния конечного автомата. Сразу скажу, что полноценный конечный автомат для работы с GSM-модемами - очень нетривиальная вещь, очень. Всё потому, что протокол - human readable, мать его.

myaso
Offline
Зарегистрирован: 31.01.2020

Благодарю. Буду разбираться...