使用AT命令通过GSM调制解调器在C#中发送Unicode消息(例如波斯语和阿拉伯语)

Yas*_*eni 9 c# unicode sms gsm at-command

我正在使用AT命令在C#.Net中开发GSM调制解调器(D-Link DWM-156)的应用程序.我在发送Unicode消息时遇到问题(例如用波斯语或阿拉伯语写的消息).这是我的计划的核心:

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");
Run Code Online (Sandbox Code Playgroud)

它适用于英文和ASCII字母.我已阅读本文,可以使用AT命令在Hyperterminal中发送Unicode消息:

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
Run Code Online (Sandbox Code Playgroud)

由于此命令正常工作,我已添加GSMPort.Write("AT+CSCS=\"UCS2\"\r");到我的应用程序,并尝试发送0645 0631 062D 0628 0627(مرحبا)或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");
Run Code Online (Sandbox Code Playgroud)

但与Hyperterminal中的AT命令不同,目标不会收到正确的字母.C#代码和Hyperterminal代码中的这些AT命令有什么区别?如果您帮我解决这个问题,我将不胜感激.


附加信息: 如您所知,通过超级终端和使用AT命令发送Unicode消息(例如波斯语字母)没有问题.在下面的代码中,我尝试发送سلام,"0633064406270645"是它的十六进制形式.但是我的手机里收到了□□□□.

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");
Run Code Online (Sandbox Code Playgroud)

在超级终端环境中,另一方面,一切都很顺利,我收到了سلام.

AT [Enter]
OK
AT+CSCS="UCS2"
OK
AT+CMGF=1 [Enter]
OK
AT+CMGS="destinationNumber" [Enter]
> 0633064406270645 [Ctrl+Z]
+CMGS: 139
OK
Run Code Online (Sandbox Code Playgroud)

我注意到在超级终端属性中,如果我检查"发送行以换行符结束"(它在属性 - >设置 - > ASCII设置中,请查看下面的图片),我将遇到与以前相同的问题C#代码.我认为GSMPort.Write默认情况下启用"使用换行符发送行结束" ?如果是,我该如何禁用它?

在此输入图像描述

Yas*_*eni 9

我终于找到了解决这个问题的方法.正如我在我的问题的"附加信息"部分中所说的那样,使用换行发送行结束导致SerialPort在超级终端的C#和AT命令之间发送Unicode消息时不匹配.我刚刚\r\n换行符替换了.修改后的代码如下:

GSMPort.Write("AT\n");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS=\"UCS2\"\n");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1\n");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\n");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "\x1A"); 
Run Code Online (Sandbox Code Playgroud)

离开SerialPort.EncodingSerialPort.NewLine属性不变.没有必要更改其默认值,只需设置AT+CSCS="UCS2"为以Unicode格式发送消息.