求ESP32搭配SIM800L实现自动接听来电的代码方案
ESP32 搭配 SIM800L 实现自动接听来电
原代码问题分析
你的代码存在几个可能导致失败的问题:
- 使用
SoftwareSerial软串口,ESP32自带多个硬件串口,软串口稳定性远不如硬件串口,易出现通信丢包。 - 未验证AT指令执行结果,无法确认
AT+ATS0=1是否被模块正确接收生效。 - 引脚选择可能存在冲突,ESP32部分引脚有特殊功能,随意使用会导致通信异常。
- 缺少SIM800L开机控制逻辑(部分模块需通过KEY引脚触发开机)及模块初始化等待时间。
修正后的工作代码
以下是基于ESP32硬件串口实现的稳定版本,包含指令验证、开机控制和来电监测:
#include <HardwareSerial.h> // 使用ESP32硬件串口2通信,避免软串口稳定性问题 HardwareSerial sim800l(2); // SIM800L开机控制引脚(可根据实际硬件连接调整) #define SIM800L_KEY_PIN 4 void setup() { // 初始化USB调试串口,用于查看模块状态 Serial.begin(115200); while (!Serial); // 等待串口连接完成 // 初始化SIM800L对应硬件串口:RX接GPIO16,TX接GPIO17,波特率9600 sim800l.begin(9600, SERIAL_8N1, 16, 17); // 控制SIM800L开机(部分模块需此步骤) pinMode(SIM800L_KEY_PIN, OUTPUT); digitalWrite(SIM800L_KEY_PIN, LOW); delay(1000); digitalWrite(SIM800L_KEY_PIN, HIGH); delay(5000); // 等待模块完成启动初始化 // 发送AT指令验证模块通信状态 sendATCmd("AT", "OK", 1000); // 设置1声铃后自动接听来电 sendATCmd("AT+ATS0=1", "OK", 1000); // 开启来电显示,方便查看来电号码 sendATCmd("AT+CLIP=1", "OK", 1000); } void loop() { // 读取SIM800L返回信息并打印到调试串口 if (sim800l.available()) { String resp = sim800l.readStringUntil('\n'); Serial.println(resp); // 监测来电提醒 if (resp.indexOf("RING") != -1) { Serial.println("检测到来电,等待自动接听..."); } } // 从调试串口发送指令到SIM800L(用于手动调试) if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); sim800l.println(cmd); } } // 封装AT指令发送与结果验证函数 void sendATCmd(String cmd, String expectedResp, unsigned long timeout) { Serial.print("[发送指令]: "); Serial.println(cmd); sim800l.println(cmd); unsigned long startMillis = millis(); while (millis() - startMillis < timeout) { if (sim800l.available()) { String resp = sim800l.readStringUntil('\n'); Serial.print("[模块返回]: "); Serial.println(resp); if (resp.indexOf(expectedResp) != -1) { Serial.println("[指令执行成功]"); return; } } } Serial.println("[指令执行超时/失败]"); }
硬件连接指南
- SIM800L RX → ESP32 GPIO17(串口2的TX引脚)
- SIM800L TX → ESP32 GPIO16(串口2的RX引脚)
- SIM800L VCC → 5V电源(必须保证供电电流≥2A,通话时峰值电流较大)
- SIM800L GND → ESP32 GND(共地)
- SIM800L KEY → ESP32 GPIO4(或其他闲置GPIO,用于控制开机)
关键注意事项
- 供电是核心:SIM800L通话瞬间电流会飙升至2A左右,USB口供电可能因电流不足导致模块重启,建议使用独立5V/2A电源供电,并在模块VCC引脚旁并联1000μF电解电容滤波。
- 引脚兼容性:避免使用ESP32的启动模式引脚(如GPIO0、GPIO2)连接SIM800L。
- SIM卡验证:确保SIM卡已激活、无欠费,且支持语音通话功能,插入时注意方向。
内容的提问来源于stack exchange,提问作者Iteza
相关产品推荐
相关产品推荐

