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

无法使用gsm调制解调器使用System.IO.Ports通过C#代码发送SMS,c#,sms,gsm,at-command,modem,C#,Sms,Gsm,At Command,Modem,单击按钮时,会向NumTxt textbox中输入的号码发送sms,并发送SMSTxt textbox中输入的文本。在texbox ComPort中输入的端口名这是按钮单击事件的事件处理程序 using System.IO.Ports; private void button1_Click(object sender, EventArgs e) { try { int mSpeed = 1; ser

单击按钮时,会向NumTxt textbox中输入的号码发送sms,并发送SMSTxt textbox中输入的文本。在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调制解调器附带的软件时,我能够发送sms。但不是通过C代码。如果有人能指出上述代码中的错误,我将不胜感激。

您应该永远,永远,永远使用睡眠来代替等待来自调制解调器的最终结果代码。正如您不会编写完全忽略来自http服务器的所有响应的http客户端一样,您也不应该向调制解调器发送AT命令,而完全忽略它发回的响应。您必须读取并解析调制解调器发送回您的所有内容。其他任何东西都不能可靠地工作

我的建议是,你们先拿一份,至少阅读第五章的全部内容。本标准是AT命令处理的圣经,将教会您大量关于AT命令处理的知识。例如,使用
WriteLine
和/或
Environment.NewLine
是错误的;AT命令行应仅以
\r
终止,而不以其他方式终止


只是想强调一下该文件的重要性:即使在爱立信与AT command在移动电话中的实施合作了十多年,我和我的同事们仍然在努力

事实上,现在不要在这里读这个答案,那个文件,在返回阅读其余部分之前,阅读第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
结尾的完整行,然后返回该行

您可以查看代码,以获取
is_final\u result\u code
函数的示例(您还可以与中的
isFinalResponseError
isFinalResponseSuccess
2进行比较)

AT+CMGS命令的处理方式必须有所不同。在发送有效负载之前,必须等待调制解调器的
“\r\n>”
响应,有关详细信息,请参阅的第一部分


1尽管您很可能应该关心命令是否成功执行。有关发送命令行和解析响应行的实际方法,请参见


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

对于您关心中间或最终响应的情况,请参阅。