2013-03-09 15 views
9

Ich entwickle eine Anwendung für GSM-Modems (D-Link DWM-156) in C# .Net mit AT-Befehle. Ich habe ein Problem beim Senden von Unicode-Nachrichten (z. B. Nachrichten in Persisch oder Arabisch). Hier ist es der Kern meines Programms:Senden von Unicode-Nachrichten (wie in Persisch und Arabisch) in C# mit AT-Befehlen über GSM-Modem

SerialPort GSMPort = new SerialPort(); 

GSMPort.PortName = "COM6"; 
GSMPort.BaudRate = 9600; 
GSMPort.Parity = Parity.None; 
GSMPort.DataBits = 8; 
GSMPort.StopBits = StopBits.One; 
GSMPort.Handshake = HandShake.RequestToSend; 
GSMPort.DtrEnable = true; 
GSMPort.RtsEnable = true; 

GSMPort.Open(); 

GSMPort.Write("AT\r"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGF=1\r"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\r\n"); 
Thread.Sleep(1000); 
GSMPort.Write(shortMessage+ "\x1A"); 

Es funktioniert gut für Englisch und ASCII-Buchstaben. Ich habe this article gelesen und kann Unicode-Nachrichten in Hyperterminal mit AT-Befehle senden:

AT [Enter] 
OK 
AT+CSCS="UCS2" or AT+CSCS="HEX" [Enter] ---> We have to convert our message to hex 
OK 
AT+CMGF=1 [Enter] 
OK 
AT+CMGS="destinationNumber" [Enter] 
> 0633064406270645002006450631062D06280627 ---> The hex format of our message (سلام مرحبا) 
+CMGS: 139 
OK 

Seit dieser Befehle korrekt gearbeitet, ich GSMPort.Write("AT+CSCS=\"UCS2\"\r"); meiner Anwendung hinzugefügt haben, und versucht 0645 0631 062D 0628 0627 (مرحبا) zu senden oder (للام).

Im Gegensatz zu AT-Befehlen in Hyperterminal erhält das Ziel keine korrekten Buchstaben. Was ist der Unterschied zwischen diesen AT-Befehlen in C# -Code und Hyperterminal-Code? Ich werde es zu schätzen wissen, wenn Sie mir helfen, dieses Problem zu lösen.


Zusätzliche Informationen: Wie Sie wissen, ich habe kein Problem, für das Senden von Unicode-Nachrichten (wie persische Buchstaben) von Hyper-Terminal und AT-Befehle. Im unteren Code versuche ich, لام zu senden, und "0633064406270645" ist die hexadezimale Form davon. Aber ich bekomme □□□□ in meinem Telefon.

GSMPort.Encoding = UnicodeEncoding.GetEncoding(1256); 
GSMPort.Write("AT\r"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CSCS=\"UCS2\"\r"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGF=1\r"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\r\n"); 
Thread.Sleep(1000); 
GSMPort.Write("0633064406270645" + "\x1A"); 

In der hyperterminalen Umgebung, auf der anderen Seite, alles geht gut und ich bekomme سلام.

AT [Enter] 
OK 
AT+CSCS="UCS2" 
OK 
AT+CMGF=1 [Enter] 
OK 
AT+CMGS="destinationNumber" [Enter] 
> 0633064406270645 [Ctrl+Z] 
+CMGS: 139 
OK 

habe ich bemerkt, dass in den Hyper Eigenschaften, wenn ich das überprüfen „-Linie senden enden mit Zeilenvorschub“ (es ist in Eigenschaften- ist> Einstellungen-> ASCII-Setups, bitte das Bild unten überprüfen), werde ich das gleiche Problem wie im C# -Code. Ich denke "send line ends with line feeds" ist standardmäßig in GSMPort.Write aktiviert? Wenn ja, wie kann ich es deaktivieren?

enter image description here

+1

auf Ihrem AT + CMGS Befehl Sie eine Schreibleiste sowie ein \ r \ n. Im AT-Skript sehe ich nur ein \ r. – rene

+0

Ja, das ist richtig, WriteLine erzeugt zusätzliche Zeilen ([Enter]) in der Nachricht. –

+0

Überprüfen Sie, ob Ihr Modem Unicode unterstützt !! – saeed

Antwort

8

ich habe endlich herausgefunden wie man dieses Problem löst.Wie ich im Abschnitt "Zusätzliche Informationen" in meiner Frage sagte, verursachte das Senden von Zeilenenden mit Zeilenvorschüben diese Nichtübereinstimmung zwischen SerialPort in C# und AT-Befehlen in Hyperterminal zum Senden von Unicode-Nachrichten. Ich habe gerade \r mit \n Zeilenvorschübe ersetzt. Der modifizierte Code ist wie folgt:

GSMPort.Write("AT\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CSCS=\"UCS2\"\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGF=1\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\n"); 
Thread.Sleep(1000); 
GSMPort.Write("0633064406270645" + "\x1A"); 

Leave SerialPort.Encoding und SerialPort.NewLine Eigenschaften unverändert. Es ist nicht notwendig, ihre Standardwerte zu ändern. Setzen Sie einfach AT+CSCS="UCS2", um Nachrichten im Unicode-Format zu senden.

+0

Es hat mir geholfen, also habe ich es als nützlich markiert, aber ich habe noch eine Frage: Konvertieren Sie alle Nachrichten zu HEX einschließlich ASCII oder UNICODE? Ich schätze es, wenn du mich wissen lassen würdest, was du schließlich getan hast. – Masoud

+0

@Masoud Ich habe versucht, arabische SMS mit dem obigen Code zu senden, aber ich habe "esponse erhalten ist unvollständig" Kannst du mir helfen? –

2

Die Standard-Codierung für SerialPort ist. Setzen Sie entweder SerialPort.Encoding auf eine Codierung, die den von Ihnen verwendeten Zeichensatz unterstützt (z. B. Encoding.UTF32), oder verwenden Sie SerialPort.Write(char[], int, int), und konvertieren Sie Ihre Unicode-Zeichenfolge auf beliebige Weise in Byte.

+0

Vielen Dank für Ihre Antwort. Ich habe die Codierung von GSMPort.Encoding in Encoding.UTF8, Encoding.Unicode und Encoding.UTF32 geändert. Aber keine dieser Änderungen war erfolgreich. Das Problem besteht weiterhin: GSMPort.Write ("AT + CSCS = \" UCS2 \ "\ r"); GSMPort.Encoding = Codierung.Unicode; –

+0

Achten Sie darauf, 'Encoding' * vor * Sie rufen' Write' –

+0

Ja habe ich 'GSMPort.Encoding' im Voraus vor allen' Write', aber es funktioniert immer noch nicht. –

2

Prüfen Sie zuerst Ihre Modem-Unterstützung unicode dann den Code dieser
ändern wir die richtige DCS (Data Coding Scheme) für Unicode-Nachrichten angeben müssen, die 0x08 ist.

Wir können diesen Wert durch den vierten Parameter des AT + CSMP Befehl '8' Wechsel:

AT + CSMP = 1,167,0,8

GSMPort.Write("AT\r"); 
    Thread.Sleep(1000); 
    GSMPort.Write("AT+CSCS=\"UCS2\"\r"); 
    Thread.Sleep(1000); 
    GSMPort.Write("AT+CMGF=1\r"); 
    Thread.Sleep(1000); 
    GSMPort.Write("AT+CSMP=1,167,0,8\r"); //AT+CSMP=1,167,0,8 
    Thread.Sleep(1000); 
    GSMPort.WriteLine("AT+CMGS=\"" + destinationNumber + "\"\r\n"); 
    Thread.Sleep(1000); 
    GSMPort.WriteLine("0633064406270645" + "\x1A"); 
+0

Ich kann Unicode-Nachrichten mit AT-Befehlen in Hyperterminal-Umgebung senden, also ja, ich bin sicher, dass Modem Unicode unterstützt. Danke für Ihre Lösung, ich habe 'GSMPort.Write (" AT + CSMP = 1,167,0,8 \ ");' versucht, aber es ändert nichts. Mit 'AT + CSMP?' Ist diese Struktur in Hyperterminal '+ AT + CSMP = 1,71,0,0 ', aber es funktioniert auch nicht. Ich habe auch versucht, AT + CSMP = 1,71,0,8. –

+0

funktioniert es gut, wenn Sie SMS per Hyperterminal Befehle senden, wenn ja, was ist Ihre Befehlswarteschlange – saeed

+0

Bitte überprüfen Sie meine Frage. Ich beschreibe, welche Folge von AT-Befehlen ich in Hyperterminal verwendet habe. Wenn Sie weitere Informationen zu meinem Modem und seinem Status benötigen, lassen Sie es mich wissen. –