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

2019-07-21 06:21发布

我使用的AT命令开发GSM调制解调器在C#.NET应用程序(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");

它工作正常的英语和ASCII字母。 我已阅读这篇文章 ,并且可以使用AT命令在超级终端发送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

由于该命令工作正常,我已经加入GSMPort.Write("AT+CSCS=\"UCS2\"\r"); 我的应用程序,并试图发送0645 0631 0628 062D 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");

但是,与AT超级终端的命令,目的不接收正确的字母。 什么是C#中的代码和超级终端代码命令它们之间的区别? 如果你帮我解决这个问题,我会升值。


其他信息:你知道我有没有问题,通过超级终端发送Unicode消息(如波斯字母),并使用AT命令。 在下面的代码我尝试发送سلام,而“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");

在超级终端环境,在另一方面,一切都很好,我收到سلام。

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

我注意到,在超级终端属性,如果我选中“发送行结束与换行符”(这是在属性 - >设置 - > ASCII设置,请检查下面的图片),我也会有同样的问题,因为我有C#代码。 我认为,在启用“饲料与线发送行结束” GSMPort.Write默认? 如果是的话,我怎么可以禁用它?

Answer 1:

我终于找到了如何解决这个问题。 正如我在我的问题的“附加信息”部分中说,发送行结束与换行符之间造成不匹配这个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"); 

离开SerialPort.EncodingSerialPort.NewLine性质不变。 这是没有必要改变其默认值,只需设置AT+CSCS="UCS2"以Unicode格式发送邮件。



Answer 2:

对于默认的编码SerialPortEncoding.ASCII 。 无论是设置SerialPort.Encoding一种编码来支持你使用(如字符集Encoding.UTF32 ),或使用SerialPort.Write(char[], int, int)和你的Unicode字符串转换为字节在任何way'd喜欢。



Answer 3:

首先,检查你的modem支持unicode ,然后更改您的代码本
我们必须指定正确的DCS(数据编码方案)对Unicode的消息,这是0x08的。

我们可以通过改变AT + CSMP命令的第四个参数为“8”设置这个值:

AT + CSMP = 1,167,0,8

    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+CSMP=1,167,0,8\r"); //AT+CSMP=1,167,0,8
    Thread.Sleep(1000);
    GSMPort.WriteLine("AT+CMGS=\"" + destinationNumber + "\"\r\n");
    Thread.Sleep(1000);
    GSMPort.WriteLine("0633064406270645" + "\x1A");


文章来源: Sending Unicode Messages (such as in Persian and Arabic) in C# using AT Commands through GSM Modem