SMS von AT-Befehlen mit GSM-Mobile wird geben Fehler
-
06-07-2019 - |
Frage
Ich bin das Senden von SMS durch AT-Befehle mit GSM-Mobiltelefon. Ich möchte wie Tausende Großteil der Nachricht senden. Ich habe gelesen, dass von GSM-Mobil wir 6-8 SMS pro Minute senden. Aber wenn ich Nachrichten senden und dann jemand gehen und jemand nicht. Ich erhalte Informationen aus Excel-Datei bedeutet, Zielnummer und Nachrichtentext. Können Sie mir sagen, warum einige SMS gehen und einige nicht. Mein Code ist
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);
}
Lösung
Ich denke, Ihr Problem ist, dass Sie nicht für das Endergebnis Code warten (das heißt OK, ERROR und ein paar andere), bevor der nächste Befehl gesendet. Das Problem dabei ist, dass der neue Befehl einen Abbruch des laufenden Befehls auslösen, wenn sie nicht beendet ist. Um Zitat V.250 :
5.6.1 Aborting Befehle
...
Aborting von Befehlen wird durch die durchgeführt Übertragung von der DTE an die DCE von einem beliebigen Zeichen.
So immer , wenn AT-Befehle zu senden, können Sie muss warten, bis das endgültige Ergebnis Code, bevor der nächste Befehl gesendet wird.
Darf ich schlage vor, Refactoring serialport.WriteLine("ATxxx" + Environment.NewLine)
in eine sendCommand(serialport, "ATxxx")
Funktion? Und dann können Sie für das Endergebnis Code am Ende dieser Funktion fügen Sie warten.
Andere Tipps
Versuchen Sie, um zu sehen, ob es ein Muster auf die Nachrichten, die nicht gesendet werden. Denn dann könnte es ein Problem mit dem Zahlenformat oder ungültigen Zeichen in der Nachricht sein.
Auch einige Hinweise:
-
Sie machen keine Fehlerprüfung. Ich würde sicherstellen, dass ich die erwartete Antwort bekam nach jedem Befehl aufrufen.
-
Sie verwenden Environment.NewLine jede Zeile zu beenden. Ich gehe davon aus, dass dies eine Eigenschaft ist, die mit dem zugrunde liegenden Betriebssystem ändert. Das Standard-AT ist jedoch sehr klar auf genau, welche Zeichen für die Beendigung Kommandozeilen zu verwenden.
-
Mobiltelefone sind echte Bastarde. Nur weil Sie die Beschreibung oder Dokumentation folgen, bedeutet nicht, sie tun. Es sei angenommen, dass jedes Handy-Modell von allen anderen anders verhält. Siehe Punkt 1.