29 KiB
29 KiB
版本说明
V1.7.1 —— 485 扩展继电器板支持(2026-09-04)
新增
- 485 级联扩展继电器板(4 路带反馈,Modbus RTU 从机 0x10),与称重秤共用 USART2 总线:
- 新模块
HardWare/RELAY/ext_relay.c:FC05 写线圈控制 + FC03 读 4 寄存器(输出/反馈/故障/版本) - 命令闭环:FC05 回显校验(300ms 超时补发 1 次)→ 150ms 触点稳定 → FC03 校验输出位+反馈位(与板载继电器反馈同语义,失败应答
Load unpowered / relay failure !)→ 应答平台 → 全状态上报 - 空闲 2s 轮询兼在线检测,连续 3 次无应答判离线;离线期间命令直接拒绝;恢复应答自动上线补报
- 反馈异常(故障位非 0)打 WARN 日志
- 新模块
- 485 总线多从机改造:USART2 收帧统一在 feedScaleProcess 收取后按站号分发(0x01 秤 / 0x10 扩展板);
总线活动时间戳移到 uart.c(
rs485_bus_touch/last_tick),秤查询与扩展板收发共用 50ms 静默保护 - 平台标识符新增 sw5~sw8:扩展板在线时状态大报文附加(4G/WiFi、带秤/无秤 4 条格式串均改); 平台物模型需加 4 个布尔字段
- 蓝牙命令新增 R5ON~R8OFF;STATUS 显示扩展板在线状态与各路开关/故障位
- 协议文档:
Docs/RS485扩展继电器协议.md(从机板按此实现)
追加(2026-09-04)
- 扩展板检测改为按需触发,取消 2s 周期轮询(平时总线零流量):
上电 3s 一次性 FC03 探测(确认在线 + 触发断电恢复比对);
控制命令改三段式:FC03 预读(判定在线 + 快照命令前反馈)→ FC05 → 150ms → FC03 校验跳变;
命令链路最终无应答即判离线并应答平台
ext relay board offline,下次命令自动重新探测恢复; 断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发) - 联网方式改为开机按键手动选择(废除自动切换):欢迎页后 10s 倒计时,KEY1(PC6)=4G / KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;超时未按 = EEPROM 记忆的上次选择(首次默认 4G); 选择变化才写 EEPROM(偏移 130,复用原联网方式记忆字节);选定后锁定通道,连不上原地重试, 不再 4G↔WiFi 自动回退(4G 无卡/无信号、WiFi 连不上均为每 10s 重试); WiFi 侧按模式限制连接方式:固定模式只连固定热点,配网模式只走已存 AP+SmartConfig; 待配置模式(未灌身份)跳过选择;WiFi 心跳重建、4G MQTTSTATU 健康检查等模式内自愈逻辑不变
- 4G MQTT 主动健康检查(移植自老工程 V1.6.6,根治断网假死):MQTT Ready 后每 60s 查一次
AT+MQTTSTATU,连续 3 次不在线(离线/未认证/查询超时)整机复位;OTA 下载期间(g_net_tx_busy)暂停查询; 被动 URC 处理保留双保险;新增复位原因码 RSN_MQTT_LOST(18)(BL 的 boot_share.h 同步补齐 16/17/18)。 WiFi 通道不加——软件 MQTT 心跳阶梯本身就是主动探测,无"被动等 URC"盲区 - 继电器/投喂平台应答文案全部中文化(UTF-8 字节转义,平台只认 UTF-8;直接写汉字=GBK 实测乱码): 负载断开或继电器损坏 / 开关·投喂参数无效 / 重量未就绪暂不能投喂 / 本设备无称重秤 / 扩展板不在线·忙·无应答等
- 指令应答改可靠发送(修复"继电器已动作但平台响应超时"):新增
NET_publish_response_wait(), 4G 通道等模组回 OK(~1.5s/次,重试 2 次,仍失败打 WARN);继电器反馈应答(板载 relayCmdProcess 3 处+ 扩展板 ext_respond)全部换用。WiFi 通道另加 QoS1+PUBACK 确认(软件 MQTT 新增 QoS1 发布与 PUBACK 解析,broker 收到才算成功,最多重试 3 次;等 PUBACK 时释放 AT 锁防死锁)原因:普通版 NET_publish_response 发完就走不等 OK,UART 应答交织/ 链路半死时应答丢失。注意排查时踩过被写成 0x12 的坑(C 源码必须是\22) - 开机二维码页:已配置身份的设备开机后 OLED 显示 10s 二维码——内容为设备 ClientID
(
MqttInfoStr.ClientID,不是产品 ID/密码),左侧 QR 白底暗码(Nayuki qrcodegen,MIT,V1~V3 自动/ECC-L/2px 模块), 右侧 x=64 起分行显示 ID 文本;10s 后自动切回正常界面,期间抑制预调度周期刷新防止覆盖; 未配置身份(待配置模式)不显示 - 扩展板状态断电记忆+上电恢复(与板载继电器一致):状态位掩码存
MqttInfoStr.Relay_State[5](原保留字节, bit0~3=扩展 1~4 路,0xFF 空白视为全断),复用 EEPROM 偏移 102 现有落盘路径; 扩展板每次离线→上线时比对 FC03 实际状态与 EEPROM 记忆,不一致的回路逐路补发 FC05 纠正 (从机上电默认全断,即实现"断电后重连恢复到断电前状态"),恢复完成统一保存+上报一次
说明
- 不挂扩展板时功能无影响(轮询无应答记离线日志);无秤模式同样可用扩展板
V1.7.0 —— 新硬件板型引脚重排(2026-09-04,不兼容老板,仓库迁至 shuichan_new)
背景
- 硬件为布线方便重新分配 IO,与老板子不兼容;代码迁至新仓库
ssh://nky@58.17.14.95:90/helei/shuichan_new.git,老仓库 shuichan 定格 V1.6.5 - 固件版本号 1.6.5 → 1.7.0;EEPROM 布局 / W25Q64 OTA 结构 / 云平台协议均不变
引脚重排对照(旧 → 新)
| 功能 | 旧 | 新 |
|---|---|---|
| CAT_PWR(4G 供电) | PC4(接模块电源开关,开漏拉低=开机) | PC1(改接 DCDC 使能脚 EN,开漏,逻辑反相:释放=工作,拉低=DCDC 停输出模块掉电) |
| CAT_RST(4G 复位) | PA4(代码原有但未接线/推挽) | PA4 直连 Air780E 复位脚,改开漏输出,拉低=复位、释放=工作;修复旧 cat_reset 结束保持低电平的隐患(复位脉冲后必须释放) |
| BT_MODE(蓝牙 AT 切换) | PB0 | PC4 |
| RELAY1~4 输出 | PB7/PB8/PC0/PC2 | PC2/PA1/PB12/PB1 |
| Relay1~4_FB 反馈 | PB6/PB9/PC1/PC3 | PC0/PC3/PC5/PB0 |
| NET_LED | PA1 | PB13 |
| EEPROM I2C(SCL/SDA) | PA11/PA12 | PB5/PB4 |
| W25Q64(CS/DO/CLK/DI) | PB4/PB5/PB3/PA15 | PB8/PB9/PB6/PB7(全在 GPIOB,不再占 JTAG 脚) |
| OLED CS2/FSO/CS1/DC/MOSI/CLK/RES | PB15/PC6/PC7/PC8/PC9/PC12/PB14 | PC12/PA12/PC8/PC9/PA15/PB3/PA11 |
| 其余(串口1~5、ESP_EN/RST、BT_RST、LED2、VBAT_ADC、SWD) | — | 不变 |
新增
- HR_IN(PA8)红外对管缺料检测:下拉输入,低=有料(传感器不接时下拉为低,不影响投料);
高电平去抖 ≈500ms 判缺料 → 停止投料并关闭继电器 1,只记日志不上报,恢复有料后解除锁存;
与秤模式无关(无秤模式继电器 1 吸合时同样保护),
feed_scale_hr_check()挂在 feedScaleProcess 开头 - KEY1~KEY4(PC6/PC7/PB14/PB15):本地按键,上拉输入,仅初始化,功能预留
- 取消原 PA8 手动模式开关(MANUAL_MODE,新板无此器件;LED1 仍为无操作占位)
BootLoader 同步变更(需 J-Link 刷一次新 BL)
- W25Q64 引脚同步重排(BL/APP 共用 main.h 引脚宏)
- CAT_PWR 反相:门禁等待期间 PC1 拉低保持 4G 断电(旧版为 PC4 置高)
V1.6.5 附加改动(2026-09-01)
- OLED 新增 OTA 下载进度页(4G/WiFi 双通道):触发升级即显示"OTA升级中/下载固件 xx%/进度条", 优先级高于已联网界面;WiFi 中止后退出该页
- OTA 期间暂停业务(g_ota_active):秤轮询/继电器状态机/延迟上报全停(入口本来就先停投喂+断继电器1), WiFi 中止自动恢复,4G 失败路径本就复位
- feed_scale 485 查询加 50ms 总线间隔保护(收帧后 50ms 内不发新查询): 为以后 485 总线挂多个传感器预留——采集终端已踩过"连续查询撞帧"的坑(见 nongye V1.0.1 修复)
BootLoader 更新(2026-08,配套 V1.6.5 APP,需 J-Link 刷写 BL 生效)
变更(仅 BootLoader,APP 不变)
- 门禁等待循环补喂外部看门狗(EXT_WDOG_FEED):修复"等 12V 恢复"期间 TPL5010 周期咬死 BL 反复重启的问题
- BL 期间保持 4G/WiFi 模块断电(PC4 置高、PA6 拉低):门禁等待时不空耗法拉电容/电池
- 门禁日志带数值:
电量低:电压 xx.xV,电量 xx%,需充至 20% 以上恢复.../电量已恢复(xx%),跳转 APP - 门禁阈值 11.0V → 11.2V(20%):市电场景=12V 断开判据不变; 锂电池场景与 APP 的 <10% 断电预警形成滞回,防止"回弹开机→负载跌落→再复位"振荡循环 (投料机支持太阳能锂电池供电,此场景无 220V,HLW8032 电能计量不可用属预期)
V1.6.0 —— 设备身份改为蓝牙灌入(固件通用化)
变更
- 固件不再包含 MQTT 身份:删除
main.h的MQTT_CLIENT_ID/USERNAME/PASSWORD编译宏, ClientID/Username/Password 只存 EEPROM(MqttInfo_Str布局与 Magic 不变);服务器地址/端口/主题保留编译默认值 - eepromReadInfo 不再与编译宏比对"修复":Magic 有效且 ClientID 非空即视为已配置,身份以 EEPROM 为准
- 待配置模式:新板/无身份时跳过 4G/WiFi 初始化与网络状态机,OLED 显示"未配置身份/SETMQTT", 串口提示用法,蓝牙保持可用
- 新增蓝牙命令:
SETMQTT ID 用户名 密码(灌入身份,保存后自动重启生效)、SETIP ip port(改服务器,保存后自动重启生效)、MQTTINFO(查询配置,密码明文)、HISTORY(按需打印最近 10 条重启记录,开机不再自动刷 10 条日志)、FACTORY(恢复出厂:整片 EEPROM 写 0xFF 全清,自动重启进待配置模式;不清 ESP 模块里 SmartConfig 保存的热点,要清用 WIFIRESET); 命令参数一律空格分隔(SETMQTT id user pass) - WiFi 固定热点支持蓝牙配置:
SETWIFI 名称 密码写 EEPROM(magic=0xA6 @200,SSID/密码各 22B), 连接时 EEPROM 优先、编译默认兜底;WIFIINFO查询(密码明文)、WIFICLEAR清除该配置回到编译默认(自动重启生效) - 新增投喂蓝牙命令(带秤模式):
FEEDSTART 投料量KG(0.1~500.0)、FEEDSTOP、FEED(查询状态) - 老设备 OTA 平滑升级:老固件已把身份写入 EEPROM,升级后直接以原身份上线,平台无感知
- 收益:固件 bin 全设备通用,OTA 批量推送不串号;量产只烧一个固件,身份现场灌入
V1.1 —— 4G 基础版
最初版本,纯 4G 通信。
功能
- 4G Air780E MQTT 联网(模组内置 MQTT,USART3 DMA+IDLE 接收,波特率自适应 115200→921600 掉电保存)
- 四路继电器远程控制(sw1~sw4 / feeding 指令),带继电器反馈检测与负载异常应答
- 两种产品形态宏
PRODUCT_WITH_FEED_SCALE:投料机(RS485 称重定量投喂,重量反增/超时保护)/ 基础四路继电器 - 4G OTA 远程升级:HTTP 分块下载(3072B/块)→ W25Q64 暂存 → CRC16+固件头校验 → BootLoader 备份/搬运/失败回滚(3 次试错)
- AT24C02 EEPROM 配置存储(MQTT 参数/版本号/继电器状态)
- 继电器断电记忆:联网后恢复继电器 2~4 上次状态,继电器 1(投喂)上电强制断开防误投料
- 蓝牙串口调试命令(USART1):RESET/INFO/STATUS/R1ON~R4OFF/OTA/RECOVERY 等
- 双看门狗:片内 IWDG(~26s) + 外置 TPL5010(7min,LED2 翻转喂狗)
- 电量检测(PA0 ADC,低电量上报 pow:0)
V1.2 —— 新增 WiFi 通道
新增
- ESP-01S WiFi 通道(UART4,PC10/PC11,RST=PA5):TCP 透传 + MCU 软件 MQTT 3.1.1(不用 AT+MQTT)
- 网络层抽象:
network.c统一 NET_* 接口,4G/WiFi 双后端互斥共享接收缓冲(Rx_Buf/U2_CopyBuff),业务层零改动 - 通道切换:4G 无 SIM/无信号重试 3 次自动回退 WiFi;WiFi 按"固定热点(60s) → SmartConfig 智能配网(60s)"连接,失败回 4G 循环
- WiFi/4G 波特率均提升至 921600(WiFi 侧 AT+UART_DEF 掉电保存,探测同步)
- 4G 信号检测(AT+CSQ 转百分比输出,无信号置标志回退 WiFi)
- GPS 定位周期上报(Air780EG 内置 GNSS,WGS-84→GCJ-02 高德坐标转换,5min 周期,fix 无效不上报)
- 状态上报同时携带 sw1 与 feeding 两个字段(平台两个开关同步刷新)
- 继电器断电记忆完善:改到 MQTT 首次就绪后恢复(修复 WiFi 兜底时永远不恢复的问题);无秤模式四路全恢复;投料模式 SW1 不恢复且强制关闭
- 新增 RECOVERY 蓝牙命令:WiFi 模块 AT+RESTORE 恢复出厂(测试 SmartConfig 用)
修复
- 透传 CIPSEND 无响应:等 CIPSTART 的 OK 收尾+延时后再发;增加"已在透传态"探测兜底
- AT 应答陈旧匹配:清缓冲改到发送之后,防止上一条应答尾巴造成"假成功"(曾致 CIPMODE 未生效)
- UART ORE 导致 HAL 中止 DMA 接收:ErrorCallback 按当前通道自愈重新武装
V1.3 —— WiFi OTA + 联网方式记忆
新增
- WiFi 通道 OTA:ESP-01S 透传 TCP 上软件实现 HTTP Range 分块下载(3072B/块,MCU 自定节奏),复用 W25Q64 双槽+CRC+BootLoader 回退体系;下载失败自动重连 MQTT 恢复业务
- 联网方式记忆(EEPROM 偏移 130):记录上次成功联网方式(4G / WiFi固定热点 / WiFi配网热点),仅变化时写一次,开机优先跑上次成功的方式
- 已存 AP 自动连接改为 AT+CIPSTATUS 主动查询(修复被动等 "WIFI GOT IP" 打印被清缓冲擦掉、永远等不到的问题)
修复
- WiFi OTA 下载停摆:DMA(NORMAL) 填满 Rx_Buf 后无 IDLE 不触发、接收永久停摆 → 在 HAL_UART_RxCpltCallback 里搬运并重启接收(UART4/USART3 同步加)
- 服务器整包灌流量冲爆接收缓冲:改 HTTP Range 分块请求自定节奏
- AT 匹配严格化:二进制安全匹配(strstr 遇 0x00 失明问题)、收到 ERROR/FAIL 快速失败、进透传前 AT+CIPCLOSE 清残留连接、CIPMUX=0 先于 CIPMODE=1
- SmartConfig 后等 IP 失败:改 CIPSTATUS 主动查询(打印被 CWSTOPSMART 交互擦掉的问题)
V1.4 —— FreeRTOS 版
新增
- 迁移到 FreeRTOS V10.0.1:net(3)/app(2)/sys(1) 三任务,idle 钩子喂 IWDG;HAL 时基改 TIM2(SysTick 归 RTOS)
- 互斥锁三把:AT 会话锁(防业务发布与 AT 应答交织)、存储锁(EEPROM/W25Q64 跨任务)、日志锁
- 无秤模式(PRODUCT_WITH_FEED_SCALE=0)不再上报 zero/onceWt 字段,平台下发设置直接拒绝
- WiFi 断链处理与 4G 对齐:TCP CLOSED(被平台踢下线)/ 心跳超时(15s) → 打印原因并直接整机复位
- Uptime 运行时长打印:联网后每 60s 一次(未联网不打印)
修复
- 迁移时漏抄 HAL_TIM_PeriodElapsedCallback(HAL 时基不走)导致开机复位循环
- RECOVERY 在透传态下直接发 AT+RESTORE 被当 TCP 数据发走:先 "+++" 退透传;RTOS 下改为 net 任务内执行恢复流程
- NET_LED 一直闪烁:补回 g_net_led_connected 状态映射(连接中闪烁,连上常亮)
V1.4-Chinese —— 串口日志中文版
新增
- 全部串口日志中文化(UTF-8 输出,Keil 加
--no_multibyte_chars解决 ARMCC 按 GBK 误读 UTF-8 吃引号问题) - 重启记录:开机打印最近 10 条"重启原因 + 上次运行时长"(W25Q64 0x100000 环形存储,一记录一扇区滑动覆盖;16 种原因码;BL 把 RCC->CSR 放共享 RAM 传给 APP)
- 断电保护(法拉电容场景):PA0 检测 12V 断开(连续 3 次 <10% 去抖)→ 立即写断电记录+上报+复位;BootLoader 主电源门禁(12V 未恢复不跳 APP);电量百分比 0~100% 限幅
- I2C 总线恢复:EEPROM 传输中途被复位拉死 SDA 时,初始化补 9 个时钟释放总线
- BL:找不到有效 APP 时 3s 快速重试(原等 IWDG 26s);回退分支跳转前校验 APP 有效性;复位原因打印
- SmartConfig 配网时 NET_LED 100ms 快闪提示;配网超时 60s→100s;新增 PRODUCT_WITH_GPS 宏开关 GPS 功能
- HardFault 串口兜底打印(轮询 USART1)
- 工程整理:bin 输出到 OutputBin/、编译对象到 Object/、AfterBuild 拆两条命令修复 bin 不更新
修复
- 首启偶发看门狗复位:I2C 总线被拉死(加上述恢复)
- 重启记录回卷一次丢 9 条:改一记录一扇区,真正滑动覆盖
- 电量显示负数:限幅 0~100%(3.3V 基准下跌失真)
- OTA 结果/确认上报超时:net 任务与业务任务竞争共享接收缓冲 → NET_process 消费加锁、发布改 2s 超时锁
V1.5 —— 蓝牙模块自动配置 + GBK 日志 + 日志等级
新增
- HLK-B40 蓝牙模块自动配置(
ble_at.c):- PB0(开漏)控制模块 PC5 进 AT 模式,上电设
AT+NAME=<BLE_NAME 宏>+ GATT UUID(FFE0 服务 + FFE1 收发共用特征,JDY-31/HM-10 同款,通用 BLE 串口 APP 可连),AT+REBOOT 生效 - EEPROM(偏移 132)缓存已配置名称:命中则开机完全跳过 AT 流程(零 AT 窗口,蓝牙 APP 不再断联,开机最早的重启记录日志都能看到);
BLESET命令手动强制重设
- PB0(开漏)控制模块 PC5 进 AT 模式,上电设
- 串口日志改 GBK 编码输出(源码整体 UTF-8→GBK 转换,串口工具选 GBK 显示中文)
- 日志等级六档命令:
LOGTRACE/LOGDEBUG/LOGINFO/LOGWARN/LOGERROR/LOGFATAL(无下划线便于手机输入),LOG查询显示等级名;写 EEPROM(偏移 160)断电保持 - USART1/USART2 接收 ORE 自愈(蓝牙模块重启乱码不再打死命令通道)
- U2_CopyBuff 20KB→10KB(RAM 占用 45.8KB→35.8KB)
修复
- 蓝牙改名被撞写:APP 数据撞进 AT 窗口把名字写成 "info" → 改"先查询后设置"幂等流程(名字已对就不开 AT 窗口)
- 设置后当场回查失败:模块设置重启才生效,改为下次开机查询校验
- OTA 结果/确认上报超时:net 任务与业务任务竞争共享接收缓冲 → NET_process 消费加锁、发布改 2s 超时锁
追加:HLW8032 电能计量(2026-08)
- 新增
HardWare/HLW8032/:UART5(PD2 只收) 4800-8E1 接收芯片每 50ms 主动上报的 24 字节帧, 帧同步(0x55/0xAA/0xFx + 0x5A)+校验和验证;只取 PF 脉冲累计换算累计电量 - 电量按手册公式换算:kWh = 总脉冲×功率参数×电压系数×电流系数/(10^9×3600); PF 16 位溢出靠数据更新寄存器 bit7 翻转计数(50ms 一帧不会漏);芯片断电重启自动重新基准
- 系数宏
HLW_U_COEF(2.004)/HLW_I_COEF(0.5) 在 main.h,对应 ZMPT107-1(100K/49.9R)+CT 1000:1(2R) - 芯片在线时每分钟日志打印电压/电流/功率/电能(调试校准用)
- 修复:计划内复位(心跳超时/被踢/OTA/命令复位等 reset_log_mark 覆盖点)前未保存电量 → reset_log_mark 里统一调 hlw8032_save(),复位不再丢未落盘的电量
- 修复:PD2 浮空噪声/真实帧使 online 为真后,每分钟电能日志在 sys_task(1KB 栈) 里格式化 4 个浮点数 导致栈溢出卡死看门狗复位 → sys_task 栈加到 2KB;帧同步加"连续 3 帧且间隔 20~150ms"防噪声假同步
- 累计脉冲(uint64)持久化 EEPROM 偏移 164:每攒约 0.1kWh 写一次 + 断电预警时立即写(法拉电容续航内)
- 平台上报标识符
energy(kWh 两位小数),MQTT 就绪且芯片在线时每分钟一次,4G/WiFi 双通道 - UART5 带 ORE 自愈;硬件:B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2
追加:新硬件引脚(2026-08)
CAT_PWR(PC4):4G 模块开机脚,开漏输出,上电拉低=模块开机ESP_EN(PA6):WiFi 模块使能,推挽输出,上电置高=模块工作BT_RST(PA7):蓝牙复位脚,推挽输出,默认拉低=正常工作(高=复位,预留)BT_MODE(PB0):蓝牙 AT/透传切换,此前版本已实现(ble_at.c 开漏控制)- 新增 OLED 屏幕(128x64 + 晶联讯 GB2312 字库 IC,
HardWare/OLED/oled.c,GPIO 模拟 SPI): CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB15;1s 刷新电压/电流/功率/电能/继电器/网络状态 - OLED 界面重构:未联网只显示联网进度(4G 各阶段中文提示 / WiFi 固定热点搜索倒计时 / SmartConfig"请打开APP广播"倒计时),联网后才显示电能/开关/网络/运行时间; 开关状态改中文(开关:开开关关);防烧屏每 10s 内容右移 0/2/4px 轮换
- 产品模式 PRODUCT_WITH_FEED_SCALE 改为运行时可切:EEPROM(172) 存 0/1(空白用 main.h 宏默认), 蓝牙命令 SCALE 查询 / SCALE0=无秤四路继电器 / SCALE1=带秤称重投料,切换后自动重启生效; 原 9 处 #if 编译分支全部改运行时判断(状态上报字段/sw1·feeding 语义/继电器1记忆/秤轮询)
- OLED 欢迎页改"继电器控制终端 / V1.5.0 RTOS";修复 4G 阻塞建链期间屏幕不显示联网进度 (bg_delay 挂调度器启动前的 500ms 刷新钩子)
- 电能底数:首次同步补足 1.00kWh(平台过滤 0 值,保证上电即有数据显示)
- 电能上报策略:>10W 每 30s 一次,≤10W 仅首次联网报一次,开关切换随状态大报文携带
- 电流零点偏移(HLW_I_ZERO_A)/功率死区+偏移(HLW_P_DEAD_W/HLW_P_ZERO_W); 电压/电流/功率 EMA 滑动平均滤波(1/8) 压空载跳变;HLW8032 连续 3 帧 20~150ms 防噪声假同步
- 修复 4G MPUB 转义错误:
误写为 C 八进制(=0x12 字节),energy/pow/指令应答 共 8 处独立报文平台收不到(上电能收到是因为状态大报文转义本来就对) - OLED 欢迎页按产品模式显示标题;运行时间改 天:时:分 格式
- 新增 SIM 卡号上报:4G 初始化 SIM 就绪后 AT+ICCID 读卡号,MQTT OK 后随 pow 上报平台 (标识符 iccid,字符串;平台物模型加字符串字段即可,便于物联网卡套餐到期查询缴费)
- 4G 运行时关闭 WiFi 模块:ESP_EN(PA6) 默认低电平,切 WiFi 才拉高、切回 4G 拉低断电(省电/延长法拉电容续航)
- 断电消息提速:电量 <10% 判定从 3s 去抖改为 100ms 快速复核,确认后优先发 pow:0、再写记录、留 500ms 让模组发完再复位(5.5F 电容下原逻辑来不及上报)
- 修复 OTA 确认通知发送失败("重试 3 次无 OK"):确认从首次发布+3s 延后到 +9s 避开开机上报风暴; 本地确认标志/版本号先于通知落盘(通知失败不再影响防回滚);通知未送达每 30s 重试直到成功; 开机 pow/ICCID 上报间隔拉开到 300ms
- 断电上报再提速:PA0 检测从 1s 轮询改 50ms 快轮询(检测+确认 ~150ms 触发);先发包后打日志; 修复发送通道忙时掉电消息被丢弃不重试的问题(NET_publish_power 返回状态,忙则 50ms 后重试直到发出)
- 修复 4G OTA 失败后"假死"(平台不可控/无法再 OTA):OTA 入口会复位 4G 模组,MQTT 已断但 ready 标志未清,S1~S4 等前置失败退出后设备假在线。现改为任何 OTA 失败路径退出后 标记原因(RSN_OTA_FAIL "OTA失败中止")并主动复位,重启走干净 4G 初始化恢复联网
- 修复 OTA 的 SAPBR 激活承载概率性失败:OTA 入口复位模组后未等网络重新附着(CATT)就 激活承载,注册慢时必失败。现 CSQ 后加 cat_wait_cgatt_attached(30),附着成功才走 SAPBR
- 新增代码版本上报:标识符 fwver(字符串,内容=FIRMWARE_VERSION_STR),每次重启联网后上报一次(避开与整数 ver 重名)
- 485 秤调试日志增强:收到帧先打印原始 hex,解析失败输出具体原因 (帧过短/站号不符/异常帧/功能码不符/CRC 错误各带说明)
- PRODUCT_WITH_FEED_SCALE 编译默认值改为 1(默认带秤;EEPROM 172 空白时生效)
- GPS 定位改运行时可切(与 SCALE 同机制):EEPROM(173),蓝牙 GPS 查询 / GPS0 关 / GPS1 开, 切换自动重启生效;原 5 处 #if 编译分支改运行时判断(GNSS 初始化/GPS 轮询)
- OTA 通知链理顺:下载完成后的 result.post(success) 改为发了就走不等 OK(下载后 MQTT 会话可能僵死, 等 OK 白卡 12s 且发不出);平台以重启后的 confirm.post(等 OK+30s 重试必达)为权威成功信号
- OTA 闭环修复:W25Q64 OTA 信息结构新增 ota_id(平台任务 id 随固件信息落盘),新固件首启确认时 在可靠连接上补发 result.post(success=1, 任务id) + confirm.post——平台"完成"标志可正常闭环
- 注意:OTA 信息结构变化,BootLoader 的 w25q64.h 已同步,需 J-Link 刷一次新 BL (旧 BL 读不了新格式,会认不出待安装固件)
- OTA 闭环(兼容版):回退 W25Q64 结构改动(BL/APP 共享结构不能动,现场无法刷 BL), 平台任务 id 改存 APP 私有 EEPROM(175~194),新固件首启确认时在可靠连接上补发 result.post(success=1, 任务id) + confirm.post,送达后清回 0xFF
- OTA 进度上报改可靠发送:progress.post 等 OK 确认(失败自动重试 1 次,每 10% 最多多花 ~3s), 平台"升级中"标志可置位;若无应答打印 WARN
- 修复 OTA 后版本序号平台不刷新:OTA 确认保存版本号后立即补发一次状态+fwver (原先要等踢线/重启/拨开关触发上报才更新)
- 修复重启后磅秤重量平台一直为 0:首次重量上报被 AT 忙丢弃后不重试, 改为发布成功才置标志,失败下轮查询继续重试
- 新增实时功率上报:标识符 power(单位 W,一位小数),与 energy 合并同一条报文 (>10W 每 30s,否则首次+开关切换),平台物模型加 float 即可
- 新增蓝牙发射功率配置:main.h 宏 BLE_TX_POWER(AT+RFPOWER 1~18 级,默认 8), 功率值并入 EEPROM 缓存判断(偏移 158),改宏后下次开机自动重设一次
- 断电消息发送加固:pow:0 改等模组回 OK(~1.5s/次,最多 3 次)+ OK 后留 800ms 空口时间; 3 次都失败也照常写记录复位(不因发送失败丢断电记录)
- 去掉电能底数 1kWh 机制(用户确认平台可正常显示小数值)
- 新增蓝牙 ENCLR 命令:累计电能清零(RAM+EEPROM 同步,无需重启)
- OLED 带秤模式第 3 行改显示重量(
重量:xx.xKG),读不到时显示原因 (无应答/帧短/CRC错/秤异常帧/站号不符);无秤模式仍显示开关状态 - 断电预警时 OLED 关显示(0xAE 黑屏,省电+避免残影)
- 去掉 OLED 防烧屏左右偏移(断电已关屏,偏移意义不大)
- 修复 485 首次应答丢失:USART2 接收可能因 ORE 残留状态卡死(自愈重挂因 RxState 非 READY 静默失败), 现每次查询前 USART2_ForceRxReset() 强制复位接收(清错误/缓冲+重挂中断),首包不再丢
- 修复 485 回声吃应答帧头:查询 TX 后等 5ms 清回声缓冲;解析时改为在帧内定位 01 03 04 帧头, 抗回声/前导垃圾(快速应答不再被吞前几个字节)
- 修正 485 修复方案:去掉 TX 后清缓冲(会吃掉快速回复的前几个字节), 改为回声帧按内容识别静默丢弃(与查询命令完全一致的帧),合并帧靠 01 03 04 帧头搜索解析
- 485 首次查询延迟 3s(避开上电窗口,防止首个应答被开机繁忙期撞坏)
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN(无应答),有应答则原有 hex/解析日志覆盖
- 撤掉 485 查询前的 ForceRxReset(AbortReceive 重挂会把接收搞死,只收到应答最后一个字节); 改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
- 根治 485 接收停摆:HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX,自愈里的 Receive_IT 静默失败 → 错误回调重挂前强制 RxState=READY;查询前清缓冲时顺带检查接收中断是否停摆并拉起(不 Abort) USART1/USART5 自愈同样加固
- 485 丢帧根因定位并加固:上位机秒回时回复帧头被 485 收发器切换延迟切掉(真秤有处理延迟不受影响); 现 400ms 无好帧或收到坏帧自动补发一次查询,仍不行才报无应答
- 485 取帧改原子操作:USART2_PollFrame 判静默+拷出+清缓冲一步完成,替代 Tick 置标志/GetFrame 取帧 的两步交接(交接窗口会被查询补发的清缓冲打断丢帧)
- 485 接收架构重写为 DMA+IDLE(DMA1_Channel6 + 空闲中断定帧,与 4G/WiFi 同架构): 根治字节中断+软件超时方案的丢帧/停摆问题;实测秒回/慢回全部一次成功。 过程:DWT 硬件观察点抓到合法写点无误,定位为原中断接收路径在特定时序下字节丢失
- 恢复 OLED 防烧屏像素偏移(每10s 右移 0/2/4px),并修复左侧残留(移位前先写空格清腾空列)
- OLED 偏移幅度加大到 0~24px(5 档),按内容宽度自动钳位不越界,左侧腾空列全量清空
- 蓝牙 AT 设置加固:AT 窗口内静音日志(UART1 与模块共用,日志字节会污染模块命令解析); 进 AT 模式+查询无应答时重新拉 PC5 重试,最多 3 轮
- 断电时序微调:确认断电后先关 OLED 屏再发掉电消息(黑屏更快+给模组留更多发送电量)
- 断电时序改为:先发掉电消息(等OK) → 屏幕显示"发生掉电事件!"亮 3 秒 → 熄屏复位
- 蓝牙设置流程开头先硬复位模块(BT_RST/PA7 拉高 100ms),防模块状态异常时 PC5 进不了 AT 模式
- OLED 新增复位脚 PB14:初始化前给 10ms 低脉冲硬件复位屏幕,防止上电时序异常花屏
- 电能/功率上报改为固定每 3 分钟一次(不再按功率阈值区分)