Zajmuję się tworzeniem aplikacji dla modemów GSM (D-Link DWM-156) w języku C# .Net za pomocą poleceń AT. Mam problem z wysyłaniem wiadomości Unicode (takich jak wiadomości napisane w języku perskim lub arabskim). Oto rdzeń mojego programu:Wysyłanie komunikatów Unicode (np. W języku perskim i arabskim) w języku C# za pomocą poleceń AT za pośrednictwem modemu GSM
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. Czytałem this article i można 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
Od tego polecenia działało poprawnie, dodałem GSMPort.Write("AT+CSCS=\"UCS2\"\r");
do mojego wniosku i próbowała wysłać 0645 0631 062D 0628 0627 (مرحبا) lub (سلام).
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 HyperTerminal, cel podróży nie otrzymuje poprawnych liter. Jaka jest różnica między tymi poleceniami AT w kodzie C# a kodem Hyperterminal? Będę wdzięczny, jeśli pomożesz mi rozwiązać ten problem.
Dodatkowe informacje: Jak wiecie nie mam problemu wysyłania wiadomości Unicode (takich jak Listy perskie) przez HyperTerminal i za pomocą komend AT. W poniższym kodzie próbuję wysłać سلام, a "0633064406270645" jest jego szesnastkową formą. Ale otrzymuję □□□□ 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, a ja otrzymuję komunikat سلام.
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 HyperTerminal gdybym sprawdzić „linię wysyłania kończy się linia zasila” (jest w Ustawienia-> Ustawienia-> Nastawienia ASCII, sprawdź poniższy obrazek), będę mieć ten sam problem, jaki miałem w kodzie C#. Sądzę, że domyślnie włączona jest opcja "wysyłanie linii końcowych z wierszami" w GSMPort.Write
? Jeśli tak, jak mogę go wyłączyć?
na twoim AT + CMGS polecenie ci pisowni tak dobrze, jak \ r \ n. W skrypcie AT widzę tylko \ r. – rene
Tak, to prawda, WriteLine generuje dodatkowe linie ([Enter]) w wiadomości. –
sprawdź, czy twój modem obsługuje kodowanie Unicode! – saeed