我正在使用C#.Net和AT指令为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");
对于英语和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
由于这些命令已经正常工作,我在我的应用程序中添加了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");
与Hyperterminal中的AT命令不同的是,目标设备无法接收到正确的字母。在C#代码和Hyperterminal代码中,这些AT命令有何区别?如果您能帮助我解决这个问题,我将不胜感激。
附加信息: 正如您所知,我通过Hyperterminal发送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
中默认启用? 如果是,则如何禁用它?
GSMPort.DataReceived += (s, e) => { Debug.WriteLine( GSMPort.ReadLine()); };
- rene