我刚刚买了一个新的Sim900并连接到Arduino Uno。 我使用下面的代码向自己发送了一条短信。 我在手机上收到了文本,但我的串行监视器上没有收到任何回声(即。"好")。 我尝试交换 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()
{
}
你永远不应该使用delay
来代替读取和分析从调制解调器发回的响应。现在,我确实认识到这是一个有点讽刺的建议,因为问题是你没有得到任何响应,但无论如何,你应该在你得到响应工作的那一刻使用延迟扔掉这段代码,而不是一秒钟后。
为了强调这一点,在向调制解调器发送 AT 命令行后,在调制解调器响应最终结果代码之前,您不应该发送任何内容。V.250标准说:
最终结果代码指示完整的 DCE 操作完成,并且 愿意接受 DTE 的新命令。
如果您在收到最终结果代码之前发送任何内容,您将中止当前正在执行的命令!
我不知道这个sim900调制解调器,但请注意,调制解调器通常可以配置为不回显字符并抑制结果代码(ATE
和ATQ
命令),因此除非您绝对确定调制解调器配置为回显字符并打印结果代码,否则这应该是您首先要检查的事情。
所有这些都在V.250标准中进行了描述,这是一个非常重要的文档。阅读第 5 章的全部内容,并密切关注第 6.2 章 DTE-DCE 接口命令。
移动电话
相关命令通常在 27.007 标准中指定,尽管 SMS 消息相关命令在 27.005 标准中指定。请密切注意这样一个事实,特别是对于AT+CMGS
,您需要等待接收"\r>",然后再发送短信有效负载(另请参阅本答案的第一部分)。
正如@hlovdal所说,在消息之间使用延迟是一个坏主意。您必须等待每个命令的答案,并根据答案(或因为超时)采取措施。
假设这就是您的所有代码,您将跳过读取串行端口的部分。就像你做serial.write一样,你必须使用serial.read来获取传入的字符。也许这就是原因,因为你没有得到任何东西。
最后,Arduino UNO有一个UART端口,所以如果你想有一个串行监视器进行调试,你必须使用SoftwareSerial与SIM900通信。