ESP32搭配SIM800L与MicroPython发送短信失败求助:网络未连接
SIM800L未联网+短信发送失败问题排查与修复
一、先解决SIM800L每秒闪烁(未注册网络)的问题
SIM800L指示灯每秒闪说明模块未注册到移动网络,先排查硬件:
- 确认SIM卡为2G兼容卡(模块仅支持2G),卡已激活、无欠费,插卡方向正确(金属触点朝下)
- 必须给SIM800L单独提供5V/2A电源,不能直接用ESP32引脚供电,峰值电流不足会直接导致无法联网
- 外接天线需拧紧,尽量放置在开阔无遮挡的区域
- 用串口助手测试基础AT指令验证模块状态:
- 发送
AT,返回OK说明模块可正常响应 - 发送
AT+CREG?,返回+CREG: 0,1或+CREG: 0,5才算注册成功(0,0=未注册,0,2=正在注册)
- 发送
二、原代码问题及修复
原代码缺少调试环节、短信中心配置,且流程逻辑不够可靠,修复后的代码如下:
import machine import time # 初始化UART,ESP32的UART2引脚TX=17、RX=16,确保这两个引脚未被其他外设占用 uart = machine.UART(2, baudrate=9600, tx=17, rx=16, timeout=1000) def read_uart(): # 读取模块返回内容,用于调试定位问题 if uart.any(): return uart.read().decode('utf-8', errors='ignore') return '' def send_sms(number, message): # 设置短信为文本模式 uart.write('AT+CMGF=1\r\n') time.sleep(0.5) print(read_uart()) # 配置短信中心号码,替换为你所在地区的运营商中心号(例:中国移动为+8613800XXX500,XXX为区号) uart.write('AT+CSCA="+8613800100500"\r\n') time.sleep(0.5) print(read_uart()) # 触发短信发送指令 uart.write(f'AT+CMGS="{number}"\r\n') time.sleep(0.5) resp = read_uart() print(resp) # 等待模块返回>符号后再发送短信内容,比固定延时更可靠 if '>' in resp: uart.write(f'{message}\r\n') time.sleep(0.5) # 发送结束符Ctrl+Z(十六进制0x1A) uart.write('\x1A') time.sleep(2) print(read_uart()) else: print("模块未回应发送指令") # 替换为你的目标手机号和短信内容 target_number = '+8613XXXXXXXXX' test_message = '这是一条测试短信' # 先测试模块是否正常响应 uart.write('AT\r\n') time.sleep(0.5) print("模块初始响应:", read_uart()) send_sms(target_number, test_message)
三、关键修复说明
- 新增
read_uart()函数,可查看模块返回信息,方便定位问题节点 - 补充短信中心号码配置,这是短信发送的必要前提,未配置无法完成发送
- 改为等待模块返回
>符号后再发送内容,替代固定延时,逻辑更稳定 - 调整延时时长,减少不必要等待的同时,给发送结束环节留足处理时间
- 开头增加
AT指令测试,先确认ESP32与SIM800L的串口连接正常
内容的提问来源于stack exchange,提问作者Mr.Programmer
相关产品推荐
相关产品推荐

