@evgen9586
Backend-dev. Лублу Enterprise и не люблю понты)

Почему при задании цикла оно требует нажатия Enter?

Программка при помощи GSM модема отправляет смс. Решил протестировать её не с одним номером, а с массивом номеров.

Сделал чтобы оно выполняло отправку for (int i = 0; i < weekDays.Length; i++)

Но вот запускаю, оно отправляет смс на 1 номер из массива и чтобы оно отправило на следующий номер массива нужно нажимать enter. Что я сделал не так?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


// добавим
using System.IO.Ports;


namespace sendSMSPDU
{
    class Program
    {
        static SerialPort port;

        static void Main(string[] args)
        {
            string[] weekDays = { "+375298036121", "+375295543598"};
            Console.WriteLine("Введите СМС");
            string a = Console.ReadLine();
            for (int i = 0; i < weekDays.Length; i++)
            { 
                port = new SerialPort();

            Console.WriteLine("Отправка сообщения СМС");
            
            //Console.WriteLine("Введите Номер");
            //string b = Console.ReadLine();

            OpenPort();
            bool result;
            result = sendSMS(a, weekDays[i]);

            if (result == true)
            {
                Console.WriteLine("Сообщение отправлено успешно");
            }
            else
            {
                Console.WriteLine("Произошла ошибка при отправке");
            }
            Console.ReadLine();
                port.Close();
            }
            
        }



        private static bool sendSMS(string textsms, string telnumber)
        {
            if (!port.IsOpen) return false;

            try
            {
                System.Threading.Thread.Sleep(500);
                port.WriteLine("AT\r\n"); 
                System.Threading.Thread.Sleep(500);

                port.Write("AT+CMGF=0\r\n"); // цифровой режим PDU для отправки сообщений
                System.Threading.Thread.Sleep(500);
            }
            catch
            {
                return false;
            }

            try
            {
                telnumber = telnumber.Replace("-", "").Replace(" ", "").Replace("+", "");

                // 01 это PDU Type или иногда называется SMS-SUBMIT. 01 означает, что сообщение передаваемое, а не получаемое 
                // цифры 00 это TP-Message-Reference означают, что телефон/модем может установить количество успешных сообщений автоматически
                // telnumber.Length.ToString("X2") выдаст нам длинну номера в 16-ричном формате
                // 91 означает, что используется международный формат номера телефона
                telnumber = "01" + "00" + telnumber.Length.ToString("X2") + "91" + EncodePhoneNumber(telnumber);

                textsms = StringToUCS2(textsms);
                // 00 означает, что формат сообщения неявный. Это идентификатор протокола. Другие варианты телекс, телефакс, голосовое сообщение и т.п.
                // 08 означает формат UCS2 - 2 байта на символ. Он проще, так что рассмотрим его.
                // если вместо 08 указать 18, то сообщение не будет сохранено на телефоне. Получится flash сообщение
                string leninByte = (textsms.Length / 2).ToString("X2");
                textsms = telnumber + "00" + "08" + leninByte + textsms;

                // посылаем команду с длинной сообщения - количество октет в десятичной системе. то есть делим на два количество символов в сообщении
                // если октет неполный, то получится в результате дробное число. это дробное число округляем до большего
                double lenMes = textsms.Length / 2;
                port.Write("AT+CMGS=" + (Math.Ceiling(lenMes)).ToString() + "\r\n");
                System.Threading.Thread.Sleep(500);

                // номер sms-центра мы не указываем, считая, что практически во всех SIM картах он уже прописан
                // для того, чтобы было понятно, что этот номер мы не указали добавляем к нашему сообщению в начало 2 нуля
                // добавляем именно ПОСЛЕ того, как подсчитали длинну сообщения
                textsms = "00" + textsms;

                port.Write(textsms + char.ConvertFromUtf32(26) + "\r\n");
                System.Threading.Thread.Sleep(500);
            }
            catch
            {
                return false;
            }

            try
            {
                string recievedData;
                recievedData = port.ReadExisting();

                if (recievedData.Contains("ERROR"))
                {
                    return false;
                }

            }
            catch { }

            return true;
        }
        
        private static void OpenPort()
        {

            port.BaudRate = 2400; //  4800, 9600, 28800 или 56000
            port.DataBits = 7; // 8, 9

            port.StopBits = StopBits.One; //  StopBits.Two StopBits.None или StopBits.OnePointFive         
            port.Parity = Parity.Odd; //  Parity.Even Parity.Mark Parity.None или Parity.Space

            port.ReadTimeout = 500; 
            port.WriteTimeout = 500; 

            port.Encoding = Encoding.GetEncoding("windows-1251");

            port.PortName = "COM4";

            // конструкция для открытия порта
            if (port.IsOpen)
                port.Close();
            try
            {
                port.Open();
            }
            catch { }

        }



        // перекодирование номера телефона для формата PDU
        public static string EncodePhoneNumber(string PhoneNumber)
        {
            string result = "";
            if ((PhoneNumber.Length % 2) > 0) PhoneNumber += "F";

            int i = 0;
            while (i < PhoneNumber.Length)
            {
                result += PhoneNumber[i + 1].ToString() + PhoneNumber[i].ToString();
                i += 2;
            }
            return result.Trim();
        }


        // перекодирование текста смс в UCS2 
        public static string StringToUCS2(string str)
        {
            UnicodeEncoding ue = new UnicodeEncoding();
            byte[] ucs2 = ue.GetBytes(str);

            int i = 0;
            while (i < ucs2.Length)
            {
                byte b = ucs2[i + 1];
                ucs2[i + 1] = ucs2[i];
                ucs2[i] = b;
                i += 2;
            }
            return BitConverter.ToString(ucs2).Replace("-", "");
        }


    }
}
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Console.ReadLine(); в конце цикла ожидает ввода линии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы