Domanda

Sto inviando SMS tramite comandi AT con telefono cellulare GSM. Voglio inviare un sacco di messaggi come migliaia. Ho letto che tramite cellulare GSM possiamo inviare 6-8 sms al minuto. Ma quando invio messaggi, qualcuno va e qualcuno no. Ricevo informazioni dal file Excel significa numero di destinazione e testo del messaggio. Puoi dirmi perché alcuni sms stanno andando e altri no. Il mio codice è

        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);
   }
È stato utile?

Soluzione

Penso che il tuo problema sia che non stai aspettando il codice del risultato finale (cioè OK, ERRORE e pochi altri) prima di inviare il comando successivo. Il problema è che il nuovo comando attiverà l'interruzione del comando in corso se non è terminato. Per citare V.250 :

  

5.6.1 Interruzione comandi

     

...

     

Interruzione   dei comandi viene eseguito dal   trasmissione dal DTE al DCE   di qualsiasi personaggio.

Quindi SEMPRE quando invii comandi AT, DEVI attendere il codice del risultato finale prima di inviare il comando successivo.

Potrei suggerire di refactoring serialport.WriteLine (" ATxxx " + Environment.NewLine) in una sendCommand (serialport, " ATxxx ") ? E poi puoi aggiungere in attesa del codice del risultato finale alla fine di quella funzione.

Altri suggerimenti

Prova a vedere se c'è un motivo per i messaggi che non vengono inviati. Perché allora potrebbe esserci un problema con il formato numerico o i caratteri non validi nel messaggio.

Inoltre, alcune note:

  1. Non si sta verificando alcun errore. Mi assicurerei di avere la risposta prevista dopo aver chiamato ciascun comando.

  2. Stai utilizzando Environment.NewLine per completare ogni riga. Presumo che questa sia una proprietà che cambia con il sistema operativo sottostante. Lo standard AT è tuttavia molto chiaro su quali caratteri usare per terminare le linee di comando.

  3. I telefoni cellulari sono veri bastardi. Solo perché segui le specifiche o la documentazione non significa che lo facciano. Supponiamo che ciascun modello di telefono si comporti in modo diverso da tutti gli altri. Vedi punto 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top