V1.5: 断电检测改50ms快轮询+先发包后打日志;修复通道忙时掉电消息被丢弃(改为50ms周期重试直到发出)

This commit is contained in:
helei 2026-08-18 08:29:53 +08:00
parent 9fe86a5111
commit 9d1842404c
6 changed files with 21 additions and 9 deletions

View File

@ -65,9 +65,12 @@ void update_batter(void)
}
if (!confirm) return;
/* 分毫必争:先发掉电消息,后打日志(串口打印也要十几 ms
* GPS -1 50ms
* */
if (NET_publish_power(0) != 0) return;
powoff = 1;
log_info("> 电量低: %d%%", (int)batter_valtage);
NET_publish_power(0); /* 优先发掉电消息 */
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
reset_log_power_loss();
HAL_Delay(500); /* 给模组把 MQTT 报文发出去的时间 */

View File

@ -317,11 +317,11 @@ void NET_publish_response(const char *cmd_id, int ok, const char *msg)
net_at_unlock();
}
/* 上报电量状态: on=1 正常, on=0 低电量 */
void NET_publish_power(int on)
/* 上报电量状态: on=1 正常, on=0 低电量。返回 0=已发出,-1=通道忙被丢弃 */
int NET_publish_power(int on)
{
if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return; }
if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return; }
if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return -1; }
if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return -1; }
if (s_backend == NET_BACKEND_4G) {
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22pow\\22:%d}}\"",
MqttInfoStr.ClientID, on ? 1 : 0);
@ -332,6 +332,7 @@ void NET_publish_power(int on)
net_wifi_publish_up(json);
}
net_at_unlock();
return 0;
}
/* 上报累计电量: energy 字段,单位 kWh两位小数 */

View File

@ -52,7 +52,7 @@ net_backend_t NET_GetActiveBackend(void);
void NET_publish_status(int sw1, int feeding, int sw2, int sw3, int sw4,
float weight_kg, float once_wt_kg, float zero_kg);
void NET_publish_response(const char *cmd_id, int ok, const char *msg);
void NET_publish_power(int on);
int NET_publish_power(int on); /* 返回 0=已发出,-1=通道忙被丢弃 */
void NET_publish_energy(float kwh); /* 上报累计电量,标识符 energy单位 kWh */
int NET_mqtt_report(const char *header, const char *ota_id, int val); /* 返回 0=送达 */
int NET_ota_confirm(void); /* 0=确认通知已送达 1=无挂起 -1=未送达(需重试) */

View File

@ -320,6 +320,7 @@ static void sys_task(void *arg)
{
(void)arg;
uint32_t batt_tick = HAL_GetTick();
uint32_t batt_fast_tick = HAL_GetTick();
uint32_t up_last = HAL_GetTick();
uint32_t up_print = HAL_GetTick();
uint32_t en_print = HAL_GetTick();
@ -335,10 +336,15 @@ static void sys_task(void *arg)
/* LED 心跳/联网指示 */
activeEvents();
/* 电量 1s 节流更新 */
/* 断电检测 50ms 快轮询PA0 掉电要抢在法拉电容耗尽前发消息) */
if (HAL_GetTick() - batt_fast_tick >= 50) {
batt_fast_tick = HAL_GetTick();
update_batter();
}
/* 运行秒数 1s 节流更新 */
if (HAL_GetTick() - batt_tick >= 1000) {
batt_tick = HAL_GetTick();
update_batter();
hlw8032_tick(); /* 攒够约 0.1kWh 写一次 EEPROM */
oled_home_refresh(up_ms); /* OLED 界面 1s 刷新 */
reset_log_tick((uint32_t)(up_ms / 1000)); /* 共享 RAM 更新运行秒数,热复位不丢 */

View File

@ -101,7 +101,7 @@
### 断电保护(法拉电容 + PA0 检测)
- APPPA0 电量检测 <10%=外部 12V 断开立即 50ms 快速复核 2 100ms 出结果法拉电容 5.5F 续航有限 3s 去抖来不及)→ **优先上报 `pow:0`** 写电能/断电记录 500ms 让模组把报文发完 复位电量百分比做了 0~100% 限幅电容放电时 3.3V 基准下跌会失真
- APPPA0 电量检测改为 **50ms 快轮询**(原 1s<10%=外部 12V 断开立即 50ms 快速复核 2 检测+确认全程 ~150ms)→ **先发 `pow:0` 后打日志** 写电能/断电记录 500ms 让模组把报文发完 复位发送通道忙 GPS 轮询占锁时不锁存下个周期重试直到发出或电容耗尽电量百分比做了 0~100% 限幅电容放电时 3.3V 基准下跌会失真
- BootLoader跳转 APP 前读 PA0寄存器直读 ADC主电源未恢复< 11V则每 500ms 检测原地等待**不跳 APP**防止单片机靠电容低压运行 APP 而外设没电的乱态12V 恢复后正常放行
- 断电记录只被下次成功启动消费一次(`boot_seen` 位翻转标记),一次掉电 = 一条记录BL 等待期间不产生记录
- BL 找不到有效 APP如只刷了 BL打印提示并每 3s 主动复位重试,刷入 APP 即恢复

View File

@ -140,3 +140,5 @@
- 修复 OTA 确认通知发送失败("重试 3 次无 OK"):确认从首次发布+3s 延后到 +9s 避开开机上报风暴;
本地确认标志/版本号先于通知落盘(通知失败不再影响防回滚);通知未送达每 30s 重试直到成功;
开机 pow/ICCID 上报间隔拉开到 300ms
- 断电上报再提速PA0 检测从 1s 轮询改 50ms 快轮询(检测+确认 ~150ms 触发);先发包后打日志;
修复发送通道忙时掉电消息被丢弃不重试的问题NET_publish_power 返回状态,忙则 50ms 后重试直到发出)