gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:43:29 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com