【问题标题】:Unable to send SMS through C# code using System.IO.Ports using gsm modem无法通过 C# 代码使用 System.IO.Ports 使用 gsm 调制解调器发送 SMS
【发布时间】:2016-01-19 00:05:39
【问题描述】:

单击按钮时,会向 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# 代码。如果有人能指出上述代码中的错误,我将不胜感激。

【问题讨论】:

    标签: c# sms gsm at-command modem


    【解决方案1】:

    您应该永远、永远、永远使用睡眠来代替等待来自调制解调器的最终结果代码。就像您不会编写一个完全忽略来自 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%正确。

    【讨论】:

    • 对于您确实关心中间或最终响应的情况,请参阅this answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2023-03-12
    相关资源
    最近更新 更多