【问题标题】:Arduino Sim900 with no echo but SMS was sent outArduino Sim900 没有回音但发送了短信
【发布时间】:2016-06-01 17:27:26
【问题描述】:

我刚得到一个新的 Sim900 并连接到一个 Arduino Uno。我使用下面的代码向自己发送了一条短信。我在手机上收到了文本,但在串行监视器上没有收到任何回声(即“OK”)。我尝试交换 RX/TX 引脚和不同的波特率,但没有成功。


void setup()
{
  Serial.begin(9600);  //Baud rate of the GSM/GPRS Module 
  Serial.println("");
  delay(2000);                  
  Serial.println("AT+CMGF=1");    
  delay(1000);
  Serial.println("AT+CMGS=\"+120########\"");    //Number to which you want to send the sms
  delay(1000);
  Serial.print("This is a test.");   //The text of the message to be sent
  delay(1000);
  Serial.write(0x1A); // send CTRL - z to end message
  Serial.write(0x0D); // Carriage Return
  Serial.write(0x0A); // Line Feed
  delay(5000); 
 }

void loop()
{
}

【问题讨论】:

  • 你能展示你的外壳和设置吗?

标签: arduino sms at-command sim900


【解决方案1】:

正如@hlovdal 所说,在消息之间使用延迟是一个坏主意。您必须等待每个命令的回答,并根据回答(或因为超时)采取行动。


假设这就是您的全部代码,您将跳过读取串行端口的部分。就像你做serial.write 一样,你必须使用serial.read 来获取传入的字符。也许这就是你没有收到任何东西的原因。


最后,Arduino UNO 有一个 UART 端口,所以如果你想拥有一个用于调试的串行监视器,你必须使用 SoftwareSerial 来与 SIM900 通信。

【讨论】:

    【解决方案2】:

    您永远不应该,永远,永远使用delay 来代替读取和解析调制解调器发回的响应。现在,我确实认识到这是一个有点讽刺的建议,因为问题是你没有得到任何响应,但你应该在响应工作的那一刻使用延迟丢弃这段代码,而不是一秒钟后。

    为了强调这一点,在向调制解调器发送 AT 命令行后,在调制解调器以最终结果代码响应之前,您不应发送任何内容。 V.250 标准说:

    最终结果代码表示完整的 DCE 操作已完成,并且 愿意接受来自 DTE 的新命令。

    如果您在收到最终结果代码之前发送任何内容,您将中止当前正在执行的命令!


    我不知道这个 sim900 调制解调器,但请注意,调制解调器通常可以配置为不回显字符并抑制结果代码(ATEATQ 命令),所以除非您完全确定调制解调器是配置为回显字符并打印结果代码,这应该是您首先要检查的内容。

    所有这些都在 V.250 标准中进行了描述,即really important document。阅读第 5 章的所有内容并密切关注第 6.2 章 DTE-DCE 接口命令


    手机相关命令一般在27.007 standard中指定,虽然短信相关命令在27.005 standard中指定。请密切注意,尤其是对于AT+CMGS,您需要等待接收“\n\r>”,然后才能发送短信有效负载(另请参阅this answer 的第一部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多