Arduino发送短信是物联网项目中常见的需求,通过结合GSM/GPRS模块(如SIM800L、SIM900A等),可以实现设备与远程通信的功能,本文将详细介绍Arduino发送短信的原理、硬件连接、代码实现、常见问题及解决方案,帮助读者快速掌握这一技术。

硬件准备
要实现Arduino发送短信,需要以下核心组件:
- 主控板:Arduino UNO、Nano或Mega等均可,推荐使用UNO,因其性价比高且易于上手。
- GSM模块:SIM800L或SIM900A是常用选择,前者体积小、功耗低,后者支持更多通信协议,需确保模块支持2G网络(部分运营商已逐步退网,需提前确认兼容性)。
- SIM卡:开通短信功能的手机SIM卡,插入GSM模块的卡槽中。
- 连接线:杜邦线(公对母、公对公)若干,用于模块与Arduino的连接。
- 电源:GSM模块工作电流较大(峰值可达2A),建议使用外部电源(如9V电池或适配器),避免通过Arduino的5V引脚供电导致不稳定。
硬件连接
以SIM800L模块与Arduino UNO为例,接线方式如下表所示:
| SIM800L引脚 | Arduino UNO引脚 | 功能说明 |
|---|---|---|
| VCC | 5V | 模块电源(需外部供电) |
| GND | GND | 公共地线 |
| TXD | Digital Pin 10 | 模块发送端(Arduino接收) |
| RXD | Digital Pin 11 | 模块接收端(Arduino发送) |
| RST | Digital Pin 9 | 可选,用于硬复位模块 |
注意事项:
- 模块的TXD需连接Arduino的RXD(软件串口),反之亦然,若使用硬件串口(Pin 0/1),需注意与上传代码的冲突,建议使用软件串口(如
SoftwareSerial库)。 - 电源接线时务必确认正负极,接反可能导致模块烧毁。
软件实现
开发环境准备
安装Arduino IDE(1.8以上版本),并确保已安装SoftwareSerial库(默认包含)。

代码编写
以下是一个完整的发送短信示例代码:
#include <SoftwareSerial.h>
// 定义软件串口引脚
SoftwareSerial gsmSerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600); // 与电脑通信的串口
gsmSerial.begin(9600); // 与GSM模块通信的串口
delay(1000); // 等待模块启动
// 初始化GSM模块
sendATCommand("AT", "OK", 1000);
sendATCommand("AT+CMGF=1", "OK", 1000); // 设置为文本模式
sendATCommand("AT+CNMI=2,2,0,0,0", "OK", 1000); // 新短信直接输出
}
void loop() {
if (Serial.available()) {
String command = Serial.readString();
gsmSerial.println(command);
delay(100);
while (gsmSerial.available()) {
Serial.write(gsmSerial.read());
}
}
// 示例:发送短信到指定号码
sendSMS("13800138000", "这是一条来自Arduino的测试短信");
delay(60000); // 每分钟发送一次
}
// 发送短信的函数
void sendSMS(String phoneNumber, String message) {
sendATCommand("AT+CMGS="" + phoneNumber + """, ">", 1000);
gsmSerial.print(message);
gsmSerial.write(0x1A); // 发送Ctrl+Z
gsmSerial.println();
delay(2000);
while (gsmSerial.available()) {
Serial.write(gsmSerial.read());
}
}
// 发送AT指令并等待响应
boolean sendATCommand(String command, String expectedAnswer, unsigned int timeout) {
gsmSerial.println(command);
long previous = millis();
while ((millis() - previous) < timeout) {
if (gsmSerial.available()) {
String response = gsmSerial.readString();
if (response.indexOf(expectedAnswer) != -1) {
return true;
}
}
}
return false;
} 代码解析
- 初始化:通过AT指令设置模块为文本模式(
AT+CMGF=1),并启用新短信提示(AT+CNMI)。 - 发送短信:使用
AT+CMGS指令指定接收方号码,输入短信内容后以0x1A(Ctrl+Z)结束。 - 调试技巧:通过
Serial.print输出模块的响应信息,便于排查问题。
常见问题与解决方案
模块无响应:
- 检查接线是否正确,尤其是TX/RX交叉连接。
- 确认SIM卡是否正常插入且未欠费。
- 尝试降低波特率(如9600、115200),部分模块默认波特率可能不同。
发送失败:
- 确认信号强度(AT指令
AT+CSQ,值越高信号越好)。 - 检查短信内容是否过长(通常限制为160字符)。
- 尝试重启模块(通过RST引脚或断电重连)。
- 确认信号强度(AT指令
相关问答FAQs
Q1:GSM模块与Arduino的波特率不匹配怎么办?
A1:波特率需两者一致,可通过AT指令AT+IPR=9600设置模块波特率,或尝试常用波特率(9600、19200、115200)测试,若仍无法通信,可使用逻辑分析仪捕获信号判断实际波特率。

Q2:如何实现Arduino接收短信并解析内容?
A2:在初始化时设置AT+CNMI=2,2,0,0,0,使新短信直接输出到串口,通过监听串口数据,使用AT+CMGR读取短信内容,并利用字符串函数(如indexOf、substring)解析指令,若短信内容为“LED ON”,则触发控制LED亮起的操作。
通过以上步骤,读者可快速搭建基于Arduino的短信通信系统,实际应用中,可结合传感器(如温湿度、烟雾报警器)实现远程监控,或通过短信指令控制继电器等执行器,拓展物联网项目的功能边界。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复