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?
auf Ihrem AT + CMGS Befehl Sie eine Schreibleiste sowie ein \ r \ n. Im AT-Skript sehe ich nur ein \ r. – rene
Ja, das ist richtig, WriteLine erzeugt zusätzliche Zeilen ([Enter]) in der Nachricht. –
Überprüfen Sie, ob Ihr Modem Unicode unterstützt !! – saeed