Senden von Unicode-Nachrichten (z. B. auf Persisch und Arabisch) in C # mithilfe von AT-Befehlen über das GSM-Modem

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

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 gelesenDieser Beitrag und kann mit AT-Befehlen Unicode-Nachrichten in Hyperterminal 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

Da diese Befehle korrekt funktionierten, habe ich hinzugefügtGSMPort.Write("AT+CSCS=\"UCS2\"\r"); zu meiner Bewerbung und versuchte zu senden0645 0631 062D 0628 0627 (مرحبا) oder0633 0644 0627 0645 (سلام).

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");

Im Gegensatz zu AT-Befehlen in Hyperterminal erhält das Ziel jedoch keine korrekten Buchstaben. Was ist der Unterschied zwischen diesen AT-Befehlen in C # -Code und Hyperterminal-Code? Ich würde mich freuen, wenn Sie mir bei der Lösung dieses Problems helfen.

Zusätzliche Information: Wie Sie wissen, habe ich kein Problem damit, Unicode-Nachrichten (z. B. persische Buchstaben) per Hyperterminal und mit AT-Befehlen zu senden. Im folgenden Code versuche ich, سلام zu senden, und "0633064406270645" ist die hexadezimale Form davon. Aber ich erhalte □□□□ 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 geht dagegen alles gut und ich erhalte سلام.

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

Ich habe festgestellt, dass in den Hyperterminal-Eigenschaften, wenn ich die Option "Zeilenende mit Zeilenvorschub senden" ankreuze (siehe Eigenschaften-> Einstellungen-> ASCII-Setups, siehe Abbildung unten), dasselbe Problem auftritt wie in C # -Code. Ich denke, "send line ends with line feeds" ist in aktiviertGSMPort.Write standardmäßig? Wenn ja, wie kann ich es deaktivieren?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage