2403_89676401 2026-03-06 15:27 采纳率: 0%
浏览 50

基于单片机的老人防走失系统设计项目里,OLED显示屏显示短信发送失败

1、遇到的问题:基于单片机的老人防走失系统设计的项目中,按下按键,发送短信,结果OLED显示屏显示短信发布失败,串口助手是这样提示
OLED显示屏显示:

img

串口助手的显示:

img

2、初步解答思路:该项目用到的Air72UG模块停产了,于是换成了Y100模块,并修改了一些小地方
(1)Y100不支持AT+SETVOLTE=1这个指令,于是

img

代码修改后

img

(2)MQTT协议的初始化配置
增加了一行代码

img

(3)JSON数据不能有换行,代码里也没有出现换行

img

修改后的

img

(4)修改了指令

img

修改后的

img

(5)解决短信发送乱码
修改一:

img

修改后的:

img

修改二:

img

修改后的:

img

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2026-03-06 15:47
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在“基于单片机的老人防走失系统设计”项目中,遇到 OLED显示屏显示短信发送失败 的问题,结合你提供的信息和初步解答思路,以下是详细的分析与解决方案:


    一、问题分析

    1.1 系统结构简述

    • 使用单片机(如STM32)作为主控。
    • 使用 Y100模块 替代了停产的 Air72UG 模块。
    • 通过 Y100 模块实现短信发送功能。
    • OLED 显示屏用于显示系统状态,包括短信发送是否成功。

    1.2 出现的问题

    • 按下按键后,短信应被发送,但 OLED 显示“短信发送失败”
    • 串口助手提示无明显错误,可能为 通信异常、配置错误或指令不兼容

    二、可能原因分析

    2.1 模块不兼容问题

    • Y100 模块与 Air72UG 在 AT 指令集上存在差异,例如:
      • AT+SETVOLTE=1 不支持 → 需要移除或替换。
      • MQTT 初始化配置缺失,导致无法正确连接服务器。
    • JSON 数据格式错误(如包含换行符)→ 导致数据解析失败。

    2.2 短信发送逻辑问题

    • 短信发送流程中未正确判断模块响应。
    • 没有处理超时或模块未就绪的情况。

    2.3 串口通信问题

    • 单片机与 Y100 模块之间通信不稳定,导致指令未正确发送或接收。
    • 模块返回的响应未被正确解析。

    三、解决方案(有序列表)

    1. 检查并修改 AT 指令

    • 问题:原代码中使用了 Y100 不支持的指令(如 AT+SETVOLTE=1)。
    • 解决方法
      • 删除或注释掉不支持的指令。
      • 例如:
        // 原代码(已删除)
        // uart_send("AT+SETVOLTE=1\r\n"); // Y100 不支持该指令
        
      • 若需启用 VoLTE 功能,可查找 Y100 支持的替代指令。

    2. 完善 MQTT 初始化配置

    • 问题:MQTT 初始化缺少关键配置。
    • 解决方法
      • 添加以下配置(根据 Y100 模块文档调整):
        // 示例:设置 MQTT 服务器地址和端口
        uart_send("AT+MQTTSET=0,0,\"your_broker_ip\",1883,0,0,0,0\r\n");
        

    3. 确保 JSON 数据格式正确

    • 问题:JSON 数据中出现换行符,导致解析失败。
    • 解决方法
      • 禁止 JSON 中出现换行符,确保数据为一行。
      • 示例:
        // 错误示例(含换行)
        char json_data[] = "{\n\"device_id\": \"123456\",\n\"status\": \"online\"\n}";
        
        // 正确示例(无换行)
        char json_data[] = "{\"device_id\": \"123456\",\"status\": \"online\"}";
        

    4. 修改短信发送指令

    • 问题:原短信发送指令不适用于 Y100。
    • 解决方法
      • 使用 Y100 支持的短信发送指令,例如:
        // 发送短信(示例)
        uart_send("AT+CMGS=\"13812345678\"\r\n"); // 设置接收号码
        delay_ms(100);
        uart_send("Hello, this is a test message.\x1A"); // 发送内容 + Ctrl+Z
        

    5. 解决短信发送乱码问题

    • 问题:短信内容乱码,可能是编码格式不匹配。
    • 解决方法
      • 修改编码方式,例如改为 GBK 或 UTF-8。
      • 修改代码如下:
        // 设置编码为 GBK
        uart_send("AT+CSCS=\"GBK\"\r\n");
        delay_ms(100);
        

    四、优化建议

    1. 添加错误处理机制

    • 在发送短信前,检测模块是否就绪,例如:
      if (check_module_ready()) {
          send_sms();
      } else {
          display_error("模块未就绪");
      }
      

    2. 增加超时重试机制

    • 如果短信发送失败,尝试重新发送
      int retry_count = 3;
      while (retry_count > 0) {
          if (send_sms()) {
              break;
          }
          retry_count--;
      }
      

    3. 调试日志输出

    • 将模块返回的响应打印到串口,便于排查问题:
      char buffer[128];
      read_uart(buffer, sizeof(buffer));
      printf("Module response: %s\n", buffer);
      

    五、总结

    | 问题 | 解决方案 | |------|----------| | AT 指令不兼容 | 移除或替换不支持的指令 | | MQTT 配置不完整 | 补充必要的初始化配置 | | JSON 格式错误 | 确保 JSON 数据无换行符 | | 短信发送指令错误 | 使用 Y100 支持的短信发送指令 | | 短信乱码 | 设置正确的编码格式(如 GBK) |


    六、参考代码片段(修改后)

    // 发送短信函数
    void send_sms(char *phone_number, char *message) {
        uart_send("AT+CMGS=\"");  // 开始设置电话号码
        uart_send(phone_number);
        uart_send("\"\r\n");
        delay_ms(100);
    
        uart_send(message);
        uart_send("\x1A");  // 发送 Ctrl+Z
        delay_ms(500);
    
        // 读取模块响应
        char resp[128];
        read_uart(resp, sizeof(resp));
        if (strstr(resp, "+CMS ERROR")) {
            display_error("短信发送失败");
        } else {
            display_success("短信发送成功");
        }
    }
    

    如果你能提供更具体的代码或模块手册,我可以进一步帮助你定位问题。希望以上内容对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 3月6日