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

标签 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");

它适用于英文和 ASCII 字母。我读过this article并且可以使用 AT 命令在 super 终端中发送 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");

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


附加信息: 如您所知,我可以通过 super 终端和使用 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");

在 super 终端环境中,另一方面,一切正常,我收到 سلام。

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

我注意到在 super 终端属性中,如果我选中“发送行以换行结束”(在属性->设置-> ASCII 设置中,请查看下图),我将遇到与以下相同的问题我有 C# 代码。我认为 GSMPort.Write 默认启用“发送行以换行结尾”?如果是,我该如何禁用它?

enter image description here

最佳答案

我终于找到了解决这个问题的方法。正如我在问题的“附加信息”部分中所说,发送行以换行结尾导致 C# 中的 SerialPort 与 super 终端中用于发送 Unicode 消息的 AT 命令之间不匹配。我刚刚将 \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格式的消息。

关于c# - 通过 GSM 调制解调器使用 AT 命令在 C# 中发送 Unicode 消息(例如波斯语和阿拉伯语),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312059/

相关文章:

c# - 我可以将默认文本设置为在 VisulStudio 2010 中的每个新创建的脚本文件中显示吗?

java - Jasper Unicode 问题与字段引用但不是资源包引用

python - 如何在我的网络应用程序中启用短信通知?

android - 从 onReceive android 获取消息线程 id 或 _id

ios - 任何适用于 iPhone 消息应用程序的 iOS 8 应用程序扩展/扩展类型?

c# - 在C#中获取进程信息的权限

c# - 实体->接口(interface)关系,如何映射

c# - 如何获取 Access (Jet) 数据库中的表列表?

python - 如何将二进制字符串转为字节?

python - 关于可打印的 UTF8 字符(用于用户名)是否达成共识?