gpt4 book ai didi

c# - 使用 GSM 调制解调器 (D-Link DWM-156) 发送英文短信

转载 作者:行者123 更新时间:2023-11-30 17:45:08 24 4
gpt4 key购买 nike

我正在使用 AT 命令在 C#.Net 中开发 GSM 调制解调器 (D-Link DWM-156) 的应用程序。我在发送英文短信时遇到问题。 我尝试发送“你好”,但我在手机中收到 □□□□ 或...除了你好。

serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.BaudRate = 9600;

serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();


serialPort1.WriteLine("AT\r");
Thread.Sleep(2000);

serialPort1.WriteLine("AT+CMGF=1\r");
Thread.Sleep(1000);

serialPort1.WriteLine("AT+CMGS=\"09390149196\"\r")
Thread.Sleep(2000);

serialPort1.WriteLine("hello" + "\x1A");
Thread.Sleep(1000);

最佳答案

很少有修复(可能更多,但我没有看到完整代码)。

  • 不要使用 WriteLine() 而要使用 Write(),因为 \r(单独)是命令行和结果代码终止符。
  • SerialPort.WriteLine() 默认写入一个 usASCII 编码的字符串,但您的 GSM 调制解调器期望使用 AT 命令指定的编码字符串。将 SerialPort.Encoding 属性设置为特定编码并发送 CSCS 命令。您可以使用 CSCS=? AT 命令询问支持的编码。即使应该应用默认 GSM,我也会避免隐含地依赖它。
  • 您无需在每个命令后等待,但必须等待调制解调器应答(检查 OKERROR 字符串)。

来自 docs :

A command line is made up of three elements: the prefix, the body, and the termination character. The command line prefix consists of the characters "AT" or "at" [...] The termination character may be selected by a user option (parameter S3), the default being CR.

在伪代码中:

void SendCommand(string command) {
serialPort.Write(command + "\r");

// Do not put here an arbitrary wait, check modem's response
// Reading from serial port (use timeout).
CheckResponse();
}

serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.BaudRate = 9600;
serialPort.DtrEnable = true;
serialPort.RtsEnable = true;
serialPort.Encoding = Encoding.GetEncoding("iso-8859-1");

serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();

SendCommand("AT"); // "Ping"
SendCommand("AT+CMGF=1"); // Message format
SendCommand("AT+CSCS=\"PCCP437\""); // Character set

SendCommand("AT+CMGS=\"123456\"") // Phone number
SendCommand("hello" + "\x1A"); // Message

要检查响应(绝对避免任意等待!),您可以从这样的事情开始(未经测试的原始改编,因此您可能需要一些调试,另请参阅 this post ):

AutoResetEvent _receive;

string ReadResponse(int timeout)
{
string response = string.Empty;

while (true)
{
if (_receive.WaitOne(timeout, false))
{
response += _port.ReadExisting();
}
else
{
if (response.Length > 0)
throw new InvalidOperationException("Incomplete response.");
else
throw new InvalidOperationException("No response.");
}

// Pretty raw implementation, I'm not even sure it covers
// all cases, a better parsing would be appreciated here.
// Also note I am assuming verbose V1 output with both \r and \n.
if (response.EndsWith("\r\nOK\r\n"))
break;

if (response.EndsWith("\r\n> "))
break;

if (response.EndsWith("\r\nERROR\r\n"))
break;
}

return response;
}

在发送命令之前添加 _receive.Reset(),当然还添加 OnPortDataReceived 作为 SerialPort.DataReceived 事件的处理程序:

void OnPortDataReceived(object sender,
SerialDataReceivedEventArgs e)
{
if (e.EventType == SerialData.Chars)
_receive.Set();
}

如果遇到问题(但可以连接),可以将 \r 替换为 \n 。一些调制解调器错误地(假设<CR>除了使用13参数没有映射到S3之外)默认使用这个字符作为命令行终止符(即使它应该只出现在V1详细输出的输出中) .更改您的代码或发送适当的 S3

关于c# - 使用 GSM 调制解调器 (D-Link DWM-156) 发送英文短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28315943/

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