STM32F407 + ML307 阿里云接入项目 - 今日测试总结
一、最终成果 ✅
成功实现了 STM32F407 通过 ML307 4G 模块连接阿里云物联网平台,并完成数据上报。
| 测试项 | 结果 | 说明 |
|---|---|---|
| STM32 ↔ ML307 串口通信 | ✅ 成功 | USART3 (PB10/PB11) 正常通信 |
| PDP 数据连接激活 | ✅ 成功 | AT+CGACT=1,1 获取到 IP |
| MQTT 连接阿里云 | ✅ 成功 | +MQTTURC: "conn",0,0 |
| 数据上报(两步法) | ✅ 成功 | +MQTTPUB: 0,2,0,0 |
| 云平台数据显示 | ✅ 成功 | 温度 25.5℃ 正常显示 |
二、核心问题及解决方案回顾
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ML307 无响应 | 供电不足(4.53V) | 改用独立 5V/2A 电源供电 |
| AT 指令无响应 | TX/RX 接线错误 | 确认交叉连接:STM32 TX→模块 RX,STM32 RX→模块 TX |
| MQTT 连接失败 | ProductKey 中字母 I 和数字 1 混淆 | 从控制台精确复制参数 |
| PDP 激活失败 | 指令拼写错误 | AT+CGACT 不是 AT+CGCAT |
上报时无 > 响应 |
中断函数只在收到 \n 时置标志 |
修改为收到 > 或 \n 都置标志 |
| 程序卡在 PDP 循环 | 重试逻辑问题 | 改为只尝试一次,成功后继续 |
三、最终正确的参数配置
c
// 阿里云设备参数
#define ALI_PRODUCT_KEY "" // 注意是字母 I
#define ALI_DEVICE_NAME "test"
#define ALI_MQTT_HOST ""
#define ALI_PORT "1883"
#define ALI_CLIENT_ID ""
#define ALI_USERNAME ""
#define ALI_PASSWORD ""
// 上报主题
#define ALI_PUB_TOPIC "/sys/k067yCVEsI7/test/thing/event/property/post"
四、硬件接线(最终确认)
| ML307 模块 | STM32F407 | 说明 |
|---|---|---|
| VCC | 独立 5V/2A 电源 | 模块独立供电 |
| GND | GND | 与 STM32 共地 |
| TXD | PB11 | 模块发送 → 单片机接收 |
| RXD | PB10 | 单片机发送 → 模块接收 |
五、成功的关键代码片段
1. 串口3中断函数(关键修复)
c
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
uint8_t data = USART_ReceiveData(USART3);
if(USART3_RxLen < USART3_RX_BUF_SIZE - 1)
{
USART3_RxBuf[USART3_RxLen++] = data;
USART3_RxBuf[USART3_RxLen] = '\0';
}
// 收到换行符或 '>' 时置标志
if(data == '\n' || data == '>')
{
USART3_RxFlag = 1;
}
}
}
2. 数据上报(两步法)
c
void ML307_ReportTemp(float temperature)
{
char cmd[256];
char json[128];
sprintf(json, "{\"id\":\"1\",\"params\":{\"temperature\":%.1f}}", temperature);
int len = strlen(json);
sprintf(cmd, "AT+MQTTPUB=0,\"%s\",0,0,0,%d", ALI_PUB_TOPIC, len);
USART3_SendString(cmd);
USART3_SendString("\r\n");
if(USART3_WaitForChar('>', 3000))
{
USART3_SendString(json);
USART3_SendString("\r\n");
USART3_WaitForResponse("+MQTTPUB: 0,2,0,0", 5000);
printf("[ML307] Report OK\r\n");
}
}
六、经验总结
-
电源是关键:ML307 必须用独立 5V/2A 电源,USB 供电不足会导致各种奇怪问题
-
参数要精确:ProductKey 中的字母 I 和数字 1 容易混淆,必须从控制台直接复制
-
接线要交叉:TX ↔ RX,RX ↔ TX,同时必须共地
-
AT 指令格式严格:不能有多余空格,JSON 长度必须准确
-
中断处理要周全 :需要同时处理
\n和>等特殊字符