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?
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
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé comment résoudre ce problème. Comme je l'ai dit dans la section "Informations Supplémentaires" de ma question, l'envoi se termine par des retours à la ligne qui a provoqué cette désadaptation entre
SerialPort
en C# et À des commandes dans hyperterminal pour l'envoi de l'Unicode des messages. J'ai juste remplacé\r
avec\n
de ligne de flux. Le code modifié est comme suit:Laisser
SerialPort.Encoding
etSerialPort.NewLine
propriétés inchangées. Il n'est pas nécessaire de changer leurs valeurs par défaut, il suffit de définirAT+CSCS="UCS2"
pour envoyer des messages au format Unicode.Je tyied pour envoyer arabe sms à l'aide du code ci-dessus, mais j'ai eu "esponse reçu est incomplet" Pouvez-vous m'aider
OriginalL'auteur Yasser Mohseni
Le codage par défaut pour
SerialPort
estEncoding.ASCII
. Soit définirSerialPort.Encoding
à un codage prend en charge le jeu de caractères que vous utilisez (commeEncoding.UTF32
) ou de l'utilisationSerialPort.Write(char[], int, int)
et convertir votre chaîne Unicode en octets de n'importe quelle manière préférez.Assurez-vous de définir
Encoding
avant vous appelezWrite
Oui je l'avais appelé
GSMPort.Encoding
à l'avance avant que tous lesWrite
s, mais il ne fonctionne toujours pas.OriginalL'auteur Peter Ritchie
Tout d'abord vérifiez que votre modem soutien
unicode
puis modifiez votre code pour cettenous avons de préciser le type de DCS (Data Schéma de Codage) pour l'Unicode des messages, ce qui est 0x08.
Nous pouvons définir cette valeur en modifiant le quatrième paramètre de la AU+PGSC de commande à 8:
À+PGSC=1,167,0,8
GSMPort.Write("AT+CSMP=1,167,0,8\r");
mais cela ne change rien. À l'aide deAT+CSMP?
cette structure dans hyperterminal est+AT+CSMP=1,71,0,0
mais ça ne fonctionne pas non plus. J'ai aussi essayéAT+CSMP=1,71,0,8
.cela fonctionne bien lorsque vous envoyez des sms par hyperterminal commandes si oui quel est votre file d'attente de commandes
Veuillez vérifier ma question. Je décris ce que la séquence de commandes que j'ai utilisé dans hyperterminal. Si vous avez besoin de plus amples informations sur mon modem et son statut s'il vous plaît laissez-moi savoir.
OriginalL'auteur saeed