SMS по AT-командам с мобильного телефона GSM выдает ошибку

StackOverflow https://stackoverflow.com/questions/1210934

  •  06-07-2019
  •  | 
  •  

Вопрос

Я отправляю SMS с помощью AT-команд с мобильного телефона GSM.Я хочу отправить огромное количество сообщений, например, тысячи.Я читал, что по мобильному телефону GSM мы можем отправлять 6-8 смс в минуту.Но когда я отправляю сообщения, то кто-то идёт, а кто-то нет.Я получаю информацию из файла Excel, это номер назначения и текст сообщения.Подскажите, почему некоторые смс идут, а некоторые нет.Мой код

        SmsFields smsObj = null;
        List<SmsFields> smsColl = null;
        SerialPort serialport = null;
        StringBuilder strbuild = new StringBuilder();
        try
        {
            //Validate the form 
            if (!Validation()) return;

            serialport = new SerialPort();

            ////Sets the properties of serial port object
            serialport.PortName = cboPort.SelectedItem.ToString();
            serialport.BaudRate = 9600;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.RequestToSend;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;

            //Open the port to send sms
            serialport.Open();

            //Check if port is opened or not
            if (!serialport.IsOpen)
            {
                MessageBox.Show("Serial port is not opened. Please try with other port");
                return;
            }

            //Create smsFields class's object and fill the data in the generic collection
            smsObj = SmsFields.Instance;
            smsColl = smsObj.FillData(txtFilePath.Text);

            if (smsColl == null)
            {
                MessageBox.Show("No data found in the excel table");
                return;
            }
            //Gets the single record from SmsFields class and sends the message
            foreach (SmsFields sms in smsColl)
            {

                //checks phone status
                serialport.WriteLine("AT" + Environment.NewLine);
                //Configures message as SMS (0 for PDU format) and (1 for text format)
                serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);

                //Sets message center number
                serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine);

                //Sets destination number
                serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine);

                //Specifies message and sends Ctrl+z
                serialport.WriteLine(sms.Message + (char)26);

                //Displays buffer containing output messages
                System.Threading.Thread.Sleep(4000);
   }
Это было полезно?

Решение

Я думаю, ваша проблема в том, что вы не ждете окончательного кода результата (т.ОК, ОШИБКА и несколько других) перед отправкой следующей команды.Проблема в том, что новая команда вызовет отмену текущей команды, если она не будет завершена.Цитировать В.250:

5.6.1 Команды отмены

...

Сокращение команд достигается путем передачи от DTE в DCE любого персонажа.

Так ВСЕГДА отправляя AT-команды, вы ДОЛЖЕН дождитесь окончательного кода результата, прежде чем отправлять следующую команду.

Могу ли я предложить рефакторинг serialport.WriteLine("ATxxx" + Environment.NewLine) в sendCommand(serialport, "ATxxx") функция?А затем вы можете добавить ожидание окончательного кода результата в конце этой функции.

Другие советы

Попытайтесь выяснить, существует ли шаблон в сообщениях, которые не отправляются. Потому что тогда может быть проблема с форматом чисел или недопустимыми символами в сообщении.

Кроме того, некоторые заметки:

<Ол>
  • Вы не проверяете ошибки. Я хотел бы убедиться, что получил ожидаемый ответ после вызова каждой команды.

  • Вы используете Environment.NewLine для завершения каждой строки. Я предполагаю, что это свойство, которое изменяется с базовой операционной системой. Стандарт AT, однако, очень четко определяет, какие именно символы использовать для завершения командной строки.

  • Мобильные телефоны - настоящие ублюдки. То, что ВЫ следуете спецификации или документации, не означает, что они выполняют. Предположим, что каждая модель телефона ведет себя не так, как все остальные. Смотрите пункт 1.

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top