Envoi de l'Unicode des Messages (comme en persan et en arabe) en C# à l'aide de Commandes AT via Modem GSM

Je développe une application pour les Modems GSM (D-Link DWM-156) C#.Net à l'aide de commandes AT. J'ai un problème d'envoi de l'Unicode des messages (Tels que des messages écrits en persan ou en arabe). Ici c'est le cœur de mon programme:

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

Il fonctionne très bien pour l'anglais et les lettres ASCII. J'ai lu cet article et peut envoyer Unicode messages dans Hyperterminal à l'aide de commandes 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

Depuis cette commande a fonctionné correctement, j'ai ajouté GSMPort.Write("AT+CSCS=\"UCS2\"\r"); à ma demande, et j'ai essayé d'envoyer 0645 0631 062D 0627 0628 (مرحبا) ou 0633 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");

Mais contrairement À des commandes dans Hyperterminal, la destination ne reçoit pas les bonnes lettres. Quelle est la différence entre ces commandes dans le code C# et Hyperterminal code? Je vais apprécier si vous m'aider à résoudre ce problème.


Informations supplémentaires:
Comme vous le savez je n'ai pas de problème pour l'envoi de l'Unicode des messages (comme les lettres persanes) par hyperterminal et à l'aide de commandes AT. Dans le code ci-dessous j'essaie d'envoyer سلام, et "0633064406270645" est le code hexadécimal de la forme de celui-ci. Mais je reçois

dans mon téléphone.

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

Dans l'hyperterminal de l'environnement, d'autre part, tout va bien et je reçois سلام.

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

J'ai remarqué que dans l'hyperterminal propriétés si j'ai cocher la case "envoyer ligne se termine avec des retours à la ligne" (c'est dans les propriétés->Paramètres-> ASCII Configurations, veuillez vérifier l'image ci-dessous), je vais avoir le même problème que j'ai eu dans le code C#. Je pense que "envoyer ligne se termine avec des retours à la ligne" est activée dans GSMPort.Write par défaut? Si oui, comment puis-je le désactiver?

Envoi de l'Unicode des Messages (comme en persan et en arabe) en C# à l'aide de Commandes AT via Modem GSM

sur votre AT+CMGS vous commande un writeline comme wel comme un \r\n. Dans le script, je ne vois qu'un \r.
Oui c'est exact, WriteLine produit des lignes supplémentaires ([Enter]) dans le message.
vérifiez que votre modem prend en charge unicode!!
Oui, il prend en charge Unicode. Je l'ai déjà mentionné dans ma question que je peux envoyer de l'Unicode des messages à l'aide de commandes AT dans Hyperterminal de l'environnement. En outre, le résultat de À+CSC=? +CSC: ("IRA", "GSM", "HEX", "PCCP437", "8859-1", "UCS2", "UCS2_0X81"). Cela signifie que le modem prend en charge Hex ("HEX") et Unicode ("UCS2"). Merci de lire cet article.
Ajoutez cette ligne avant de commencer à envoyer à voir dans votre fenêtre de débogage de ce que votre modem est de vous dire : GSMPort.DataReceived += (s, e) => { Debug.WriteLine( GSMPort.ReadLine()); };

OriginalL'auteur Yasser Mohseni | 2013-03-09