从日志来看,主要有两类问题:
一、led_indicator_stop
报 invalid p_handle
E (5750) led_indicator: …/led_indicator.c:461 (led_indicator_stop):invalid p_handle
原因分析
led_indicator_stop()
的参数p_handle
(即之前led_indicator_start()
返回的句柄)无效或为NULL
。- 可能在调用 stop 之前,start 并未成功返回,或者您没有把返回值正确地保存到一个全局/静态变量里就直接调用了 stop。
建议方案
-
检查返回值
led_indicator_handle_t handle = NULL; esp_err_t err = led_indicator_start(&handle, &cfg); if (err != ESP_OK || handle == NULL) { ESP_LOGE(TAG, "led_indicator_start failed: %d", err); // 不要调用 stop } // … 若要停止指示灯: if (handle) { led_indicator_stop(handle); }
-
保持句柄生命周期
- 确保
handle
的作用域足够长(不要在局部函数栈上提前释放)。 - 如果多次 start/stop,最好用一个全局或静态变量追踪当前状态。
- 确保
二、PPP 拨号失败:ATD*99***1# ... failed
W (11265) esp_modem_dce: esp_modem_dce_generic_command(31): Command:ATD*99***1# ...failed
E (11265) esp-modem-dte: esp_dte_handle_line(79): handle line failed
原因分析
- 模组发出的拨号命令
ATD*99***1#
被 DCE(调制解调器)拒绝,导致 PPP 建连失败。 - 典型原因是:未先设置 PDP 上下文 APN,或拨号字符串不符合网络运营商要求。
建议方案
-
设置 APN
// 举例:移动卡 APN 通常是 “cmnet” 或 “cmwap”,请根据实际 SIM 卡运营商调整 esp_modem_dce_t *dce = esp_modem_dce_get_handle(modem); esp_modem_dte_generic_command(dce, "AT+CGDCONT=1,\"IP\",\"cmnet\"", NULL, 0); // 第 1 个 PDP,上网方式 IP
-
确认 SIM 已附着网络
// 确保 SIM 卡已经注册且附着 GPRS/3G/4G esp_modem_dte_generic_command(dce, "AT+CGATT=1", NULL, 0);
-
使用正确的拨号命令
-
有些模组或运营商需要
ATD*99#
,而不是*99***1#
;也可以直接使用esp_modem_dce_generic_command(dce, "ATD*99#", NULL, 0);
-
ESP-Modem 库在
esp_modem_dce_start_ppp()
内部会自动选择拨号字符串,若自定义不生效可以手动发:esp_modem_dte_write(modem->dte, "ATD*99#\r", strlen("ATD*99#\r"));
-
-
查看运营商返回的错误码
- 在
esp_modem_dce_generic_command(...)
前后加上日志打印,捕获完整的 AT 返回值,以便定位是 “插槽无响应”、“未激活” 还是 “APN 不匹配”。
- 在
三、综合示例
// 假设 modem 已经通过 esp_modem_new_*() 创建并关联好 DTE/DCE
// 1. 设置 PDP/ APN
esp_modem_dte_generic_command(dce, "AT+CGDCONT=1,\"IP\",\"your.apn.here\"", NULL, 0);
// 2. 附着网络
esp_modem_dte_generic_command(dce, "AT+CGATT=1", NULL, 0);
// 3. 启动 PPP(内部会执行 ATD 拨号)
// 若失败,可改用手动拨号:
esp_err_t err = esp_modem_dce_start_ppp(dce);
if (err != ESP_OK) {
ESP_LOGW(TAG, "自动拨号失败,尝试手动拨号 ATD*99#");
esp_modem_dte_generic_command(dce, "ATD*99#", NULL, 0);
}
// 4. 等待 PPP 成功或失败的事件
// 在 event_handler() 中处理 PPP 成功/失败,并打印更详细的返回行
通过上述检查和调整,应该能解决:
- LED 指示灯无效句柄 —— 正确管理
led_indicator_handle_t
。 - PPP 拨号失败 —— 先设置 APN,再确认 SIM 附着,使用正确的拨号命令。
如还有新日志或错误码,欢迎继续贴出来一起定位!