我想在C#中使用AT命令发送sms。现在,它只适用于一条消息。它带有自然的字符。它是用UCS2编码的。但我不能发送更长的消息,因为我添加User Data Header时有奇怪的字符。我的代码:
string messageSmsEncoded1 = "050003CC0201" + UnicodeStr2HexStr("dddd");
targetPhoneNo = UnicodeStr2HexStr(PhoneNumber);
string phone_number = Char.ConvertFromUtf32(34) + targetPhoneNo + Char.ConvertFromUtf32(34);
serialPort.Write("AT");
Thread.Sleep(100);
var responseAt = serialPort.ReadExisting();
serialPort.Write("AT+CSCS = ?" + Char.ConvertFromUtf32(13));
Thread.Sleep(100);
var responseCscs = serialPort.ReadExisting();
serialPort.Write("AT+CSCS=\"UCS2\"" + Char.ConvertFromUtf32(13));
Thread.Sleep(100);
var responseUcs2 = serialPort.ReadExisting();
serialPort.Write("AT+CMGF=1" + Char.ConvertFromUtf32(13));
Thread.Sleep(100);
var responseCmgf = serialPort.ReadExisting();
// set data coding scheme
serialPort.Write("AT+CSMP=17,167,0,8" + Char.ConvertFromUtf32(13));
Thread.Sleep(100);
var responseCsmp = serialPort.ReadExisting();
serialPort.Write("AT+CMGS=" + phone_number + Char.ConvertFromUtf32(13));
Thread.Sleep(100);
var responseCmgs = serialPort.ReadExisting();
serialPort.Write(messageSmsEncoded1 + Char.ConvertFromUtf32(26) + char.ConvertFromUtf32(13));我得到了:
Ԁόȁdddd如何在UCS2编码的消息中添加UDH?
发布于 2021-11-27 23:40:23
在这里,您有几件事需要修复。
使用Thread.Sleep绝对是最糟糕的做法。。例如,您的代码
serialPort.Write("AT");
Thread.Sleep(100);
var responseAt = serialPort.ReadExisting();有一个错误,因为这里缺少"\r"命令行终止符,因此调制解调器上实际上没有执行任何命令,也不会返回任何响应。但是,由于您没有解析响应,因此不会被检测到。
正如您不会编写一个完全忽略来自http服务器的所有响应的http客户端一样,您也不应该向调制解调器发送AT命令,而完全忽略它发回的响应。你必须对调制解调器发回给你的所有内容进行读取和解析。其他任何东西都不会可靠地工作。
那么Char.ConvertFromUtf32(13)就错了;您应该直接用'\r'字符(一个8位字节)来结束AT命令行,AT+CSCS编码与此完全无关。
您尝试将字符串编码为UCS2似乎没问题,除了Char.ConvertFromUtf32(34)是错误的,原因与回车符相同。最好从phone_number变量中去掉双引号字符,只需写成
"AT+CMGS=\"" + phone_number + "\"\r"或者实际上,这是一个很好的机会,可以开始使用ucs2_phone_number或phone_number_ucs2来制作wrong code look wrong。
对于AT+CMGS命令,您必须等待调制解调器发出信号,表明它已准备好接收数据有效负载。否则,在最坏的情况下,您将中止命令。在最好的情况下,它可能会起作用,但如果发送得太早,可能会丢失一些有效负载。请参阅this answer的第一部分。
最后,为了发送包含User Data Header的短信,您必须以AT+CMGF=0模式发送短信。有关详细信息,请参阅27.005规范(任何非旧版本都可以)。
https://stackoverflow.com/questions/70042622
复制相似问题