Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
574 views
in Technique[技术] by (71.8m points)

Sending Unicode Messages (such as in Persian and Arabic) in C# using AT Commands through GSM Modem

I am developing an application for GSM Modems (D-Link DWM-156) in C#.Net using AT commands. I have a problem sending Unicode messages (Such as messages written in Persian or Arabic). Here it is the core of my program:

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
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS="" + destinationNumber + ""
");
Thread.Sleep(1000);
GSMPort.Write(shortMessage+ "x1A");

It works fine for English and ASCII letters. I have read this article and can send Unicode messages in Hyperterminal using AT commands:

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

Since this commands worked correctly, I have added GSMPort.Write("AT+CSCS="UCS2" "); to my application, and tried to send 0645 0631 062D 0628 0627 (?????) or 0633 0644 0627 0645 (????).

GSMPort.Write("AT
");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS="UCS2"
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS="" + destinationNumber + ""
");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "x1A");

But unlike AT commands in Hyperterminal, destination does not receive correct letters. What is the difference between these AT commands in C# code and Hyperterminal code? I will appreciate if you help me to resolve this problem.


Additional information: As you know I have no problem for sending Unicode messages (such as Persian letters) by hyperterminal and using AT commands. In below code I try to send ????, and "0633064406270645" is the hexadecimal form of it. But I receive □□□□ in my phone.

GSMPort.Encoding = UnicodeEncoding.GetEncoding(1256);
GSMPort.Write("AT
");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS="UCS2"
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS="" + destinationNumber + ""
");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "x1A");

In the hyperterminal environment, On the other hand, everything goes fine and I receive ????.

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

I have noticed that in the hyperterminal properties if I check the "send line ends with line feeds" (it is in properties->Settings-> ASCII Setups, please check the picture below), I will have the same problem as I had in C# code. I think "send line ends with line feeds" is enabled in GSMPort.Write by default? If yes, how can I disable it?

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I have finally found out how to resolve this problem. As I said in in the "Additional Information" section of my question, sending line ends with line feeds caused this mismatching between SerialPort in C# and AT commands in hyperterminal for sending Unicode messages. I have just replaced with line feeds. The modified code is as follow:

GSMPort.Write("AT
");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS="UCS2"
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1
");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS="" + destinationNumber + ""
");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "x1A"); 

Leave SerialPort.Encoding and SerialPort.NewLine properties unchanged. It is not necessary to change their default values, just set AT+CSCS="UCS2" to send messages in Unicode format.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...