Как слушать лог порта?
- Войдите на сайт для отправки комментариев
Пт, 31/01/2020 - 22:31
Доброго времени. Не совсем в тему, но тут должны разбираться.
Ситуация такая. Есть 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; } } }
+CMT приходит на любое входящее СМС. Посему единственно правильным методом будет написание finite state machine для отслеживания и анализа того, что приходит в порт, а не ожидание чуда с помощью Thread.Sleep.
+CMT приходит на любое входящее СМС. Посему единственно правильным методом будет написание finite state machine для отслеживания и анализа того, что приходит в порт, а не ожидание чуда с помощью Thread.Sleep.
Вот да, именно это и нужно. А не подскажите точную функцию этого? Не могу найти в гугле
И правильно ли понимаю - После отправки смс2 производим действия (finite state machine) - он просто не закрывает лог и анализирует его, если имеется +CMT, записать в переменную ответ и продолжать работать дальше(закрытие порта и т.п.). Тут ещё вся сложность в том, что все действия выполняются в программе автоматизации действий(т.е. отдельные кубики - отправка смс;отправка смс;получение смс;)
C# не знаю, вот пытаюсь кое как разобраться со своей задачей.
C# не знаю, вот пытаюсь кое как разобраться со своей задачей.
Теория конечных автоматов не привязана к языку программирования ;) В общем случае - ваша задача решается при помощи конечного автомата (finite state machine). Объяснять "на пальцах" от и до - очень долго и нудно, вам проще почитать теорию.
Для того, чтобы получить необходимый результат, первое, что нужно сделать - это изложить алгоритм русскими словами на бумаге. Затем - формализовывать его на конкретном языке программирования. Ваш алгоритм выглядит в псевдокоде примерно так:
Ну а все дальнейшие действия зависят от состояния конечного автомата. Сразу скажу, что полноценный конечный автомат для работы с GSM-модемами - очень нетривиальная вещь, очень. Всё потому, что протокол - human readable, мать его.
Благодарю. Буду разбираться...