Wysyłanie wiadomości Unicode (takich jak perski i arabski) w języku C # za pomocą poleceń AT za pośrednictwem modemu GSM

Zajmuję się tworzeniem aplikacji dla modemów GSM (D-Link DWM-156) w C # .Net za pomocą komend AT. Mam problem z wysyłaniem wiadomości Unicode (takich jak wiadomości napisane w języku perskim lub arabskim). Oto rdzeń mojego programu:

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

Działa dobrze dla liter angielskich i ASCII. przeczytałemTen artykuł i może wysyłać wiadomości Unicode w Hyperterminal za pomocą komend AT:

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

Ponieważ polecenia te działały poprawnie, dodałemGSMPort.Write("AT+CSCS=\"UCS2\"\r"); do mojej aplikacji i próbowałem wysłać0645 0631 062D 0628 0627 (مرحبا) lub0633 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");

Ale w przeciwieństwie do poleceń AT w Hyperterminalu, miejsce docelowe nie otrzymuje poprawnych liter. Jaka jest różnica między tymi poleceniami AT w kodzie C # i kodzie Hyperterminala? Będę wdzięczny, jeśli pomożesz mi rozwiązać ten problem.

Dodatkowe informacje: Jak wiesz, nie mam problemu z wysyłaniem wiadomości Unicode (takich jak litery perskie) przez hiperterminal i używanie komend AT. W poniższym kodzie staram się wysłać سلام, a „0633064406270645” to jego szesnastkowa postać. Ale odbieram □□□□ w moim telefonie.

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

W środowisku hiperterminalnym, Z drugiej strony, wszystko idzie dobrze i otrzymuję سلام.

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

Zauważyłem, że we właściwościach hiperterminalu, jeśli zaznaczę „wyślij końce linii za pomocą linii” (to jest we właściwościach-> Ustawienia-> Ustawienia ASCII, sprawdź zdjęcie poniżej), będę miał ten sam problem, co ja w Kod C #. Myślę, że „wyślij linię kończy się liniami” jest włączone wGSMPort.Write domyślnie? Jeśli tak, jak mogę to wyłączyć?

questionAnswers(3)

yourAnswerToTheQuestion