gpt4 book ai didi

c# - 无法使用 System.IO.Ports 使用 gsm 调制解调器通过 C# 代码发送 SMS

转载 作者:行者123 更新时间:2023-11-30 20:21:46 25 4
gpt4 key购买 nike

单击按钮时,会向在 NumTxt 文本框中输入的号码发送短信,并发送在 SMSTxt 文本框中输入的文本。 texbox 中输入的端口名称 ComPort 这里是按钮点击事件的事件处理程序。

  using System.IO.Ports;

private void button1_Click(object sender, EventArgs e)
{
try
{
int mSpeed = 1;
serialport.PortName = ComPort.Text;
serialport.BaudRate = 96000;
serialport.Parity = Parity.None;
serialport.DataBits = 8;
serialport.StopBits = StopBits.One;
serialport.Handshake = Handshake.XOnXOff;
serialport.DtrEnable = true;
serialport.RtsEnable = true;
serialport.NewLine = Environment.NewLine;
Console.WriteLine("1a");
try
{
serialport.Open();
}
catch (Exception)
{
MessageBox.Show("Try another Port." +
Environment.NewLine + "Phone not detected or The requested resource is in
use.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Console.WriteLine("2a");

serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine("AT+CSCS=GSM" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine("AT+CMGS=" + (char)34 + NumTxt.Text
+ (char)34 + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine(SMSTxt.Text + (char)26);
System.Threading.Thread.Sleep(mSpeed);
serialport.Close();

}
catch (Exception)
{
if (serialport.IsOpen)
serialport.Close();
MessageBox.Show("Couldn't send the SMS.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

我昨天能够使用这个代码发送短信,但我不知道为什么它不再起作用了。没有抛出异常。当我使用gsm调制解调器自带的软件时,我可以发送短信。但不是通过 C# 代码。如果有人能指出上面代码中的错误,我将不胜感激。

最佳答案

您应该永远、永远、永远使用 sleep 代替等待来自调制解调器的最终结果代码。正如您不会编写一个完全忽略来自 http 服务器的所有响应的 http 客户端一样,您也不应该将 AT 命令发送到调制解调器并完全忽略它发回的响应。您必须读取并解析调制解调器发回给您的所有内容。没有其他方法可以可靠地工作。

我的建议是您首先获取 V.250 standard 的副本并至少阅读第 5 章的全部内容。该标准是 AT 命令处理的圣经,将教会您大量有关 AT 命令处理的知识。例如,使用 WriteLine 和/或 Environment.NewLine 是错误的; AT 命令行应该单独以 \r 结束,没有其他任何内容。


只是为了强调该文件的重要性:即使在爱立信的手机中实现 AT 命令十多年后,我和我的同事仍然 consulted that standard regularly .

事实上,现在停止阅读此答案,download该文档,请阅读第 5 章的全部内容,然后再返回阅读其余部分。


对于发送您不特别关心响应的命令1,唯一可靠的方法是做类似的事情

serialport.Open();
...
// start sending AT+CMGF=1
serialport.Write("AT+CMGF=1\r");
do {
line = readLine(serialport);
} while (! is_final_result_code(line))
// Sending of AT+CMGF=1 command finished (successfully or not)
...
serialport.Close();

readLine 函数从串行端口读取一个字节,直到它收到以 \r\n 结尾的完整行,然后返回该行。

您可以查看 atinout 的代码对于 is_final_result_code 函数的示例(您还可以与 ST-Ericsson's U300 RIL 中的 isFinalResponseErrorisFinalResponseSuccess2 进行比较) .

AT+CMGS 命令必须以不同方式处理。在发送有效负载之前,您必须等待来自调制解调器的 "\r\n> " 响应,请参阅 this answer 的第一部分了解详情。


1 尽管您很可能应该关心命令是否成功执行。参见 this answer以现实的方式发送命令行并解析响应行。

2 请注意,CONNECT 不是最终结果代码,它是中间结果代码,因此名称 isFinalResponseSuccess 严格来说并不是 100% 正确。

关于c# - 无法使用 System.IO.Ports 使用 gsm 调制解调器通过 C# 代码发送 SMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33234810/

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