为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
一只名叫tom的猫 2019-08-14 15:47:22
无法使用gsm调制解调器使用System.IO.Ports通过C#代码发送SMS单击一个按钮,将短信发送到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#代码。如果有人能指出上述代码中的错误,我将非常感激。
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

永远不应该,永远不要使用睡眠代替等待调制解调器的最终结果代码。正如您不会编写完全忽略来自http服务器的所有响应的http客户端一样,您不应将AT命令发送到调制解调器并完全忽略它发回的响应。您必须阅读并解析调制解调器发回给您的所有内容。没有别的东西能可靠地运作。

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


只是为了强调该文件的重要性:即使在爱立信手机中实施AT命令十多年后,我和我的同事仍然定期查阅该标准。

事实上现在停止阅读这个答案,下载该文件,阅读第5章的全部内容,然后再回头阅读其余内容。


对于发送不特别关心响应1的命令,唯一可靠的方法是执行类似的操作

serialport.Open();...// start sending AT+CMGF=1serialport.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的U300 RIL中isFinalResponseErrorisFinalResponseSuccess22进行比较)。

查看完整回答
反对 回复 2019-08-14
  • 1 回答
  • 0 关注
  • 439 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信