feat(屏板): 协议层 sb_proto(帧 A 解析 / 帧 B 组帧 / CRC-16)

批 1 的 1-1:新建 Drivers/BSP/ScreenLink/sb_proto.c/h,纯逻辑、无 HAL 依赖,
可主机侧单测。屏板侧的协议事实源是 DTU-LCD 的 CRC16.c / MODBUS.c / rs485.h。

- CRC-16/MODBUS 用一张 16 位合并表(512 B,与屏板两张 8 位表同量)。可逐项
  验证的关系:s_crc_table[i] == (auchCRCLo[i] << 8) | auchCRCHi[i]——屏板把
  低字节表叫 Hi、高字节表叫 Lo,这正是下面那个字节序陷阱的根源。
- 帧 A 解析:先校 CRC 再看字段。地址/功能码/命令类型不符报 BSP_ERR_PARAM,
  CRC 不符报 BSP_ERR_CRC(调用方据此决定"计数"还是"静默丢")。RT_CMD 带
  非 0 key 不报错、按 0 收——为这一项丢一帧等于丢一次刷新,代价不对等。
- 帧 B 组帧:普通图(掩码小端)+ LOGO(宽高大端 + 魔数 0x89 0x45),整帧
  4208 B 重写(998 B 填充固定 0x00 且参与 CRC),组完即自校验。
  LOGO 容量按字节数判(((w+7)/8)*h <= 3200)而不是像素数:161x159 只有
  25599 像素,却要 3339 B 才装得下。
- 主机单测 59/59 PASSED(test/host/sb_proto/),覆盖率 74/74 行、6/6 函数。
  其中两条向量是屏板自己算出来的线上字节(01 03 01 00 F0 48 与
  01 03 00 09 31 DE),并按屏板 Check_CRC 的口径反查"它会认这一帧"。
- 双端注册:uvprojx 加 File + IncludePath;模拟器侧走 check_registration.py
  的 MCU-only 豁免(纯逻辑,模拟器无消费路径)。
- Keil 构建 0 错误 0 警告;Code 不变——尚无调用者,链接器按未用节丢弃。

文档侧的 CRC 字节序订正见下一个提交。
This commit is contained in:
2026-10-29 19:17:28 +08:00
parent 71b6a5fa14
commit b25d70e962
7 changed files with 1081 additions and 21 deletions
+88 -20
View File
@@ -344,6 +344,14 @@
"lines_covered": 108,
"lines_valid": 112
},
"Drivers/BSP/ScreenLink/sb_proto.c": {
"func_rate": 1.0,
"funcs_covered": 6,
"funcs_valid": 6,
"line_rate": 1.0,
"lines_covered": 74,
"lines_valid": 74
},
"Drivers/BSP/UI/ui_data.c": {
"func_rate": 0.9767,
"funcs_covered": 42,
@@ -607,6 +615,13 @@
"lines_total": 961,
"ok": true
},
"sb_proto": {
"files": {
"Drivers/BSP/ScreenLink/sb_proto.c": 74
},
"lines_total": 74,
"ok": true
},
"sha256": {
"files": {
"App/util/sha256.c": 114
@@ -741,22 +756,23 @@
"Drivers/BSP/NET/net_socket.c",
"Drivers/BSP/NETCFG/ftp_cfg.c",
"Drivers/BSP/NETCFG/net_cfg.c",
"Drivers/BSP/ScreenLink/sb_proto.c",
"Drivers/BSP/UI/ui_data.c",
"Drivers/BSP/UI/ui_net_sink.c",
"Drivers/BSP/UI/ui_w_soe.c"
],
"totals": {
"files_generated_excluded": 5,
"files_tested": 46,
"files_untested": 151,
"func_rate": 0.9317,
"funcs_covered": 532,
"funcs_valid": 571,
"line_rate": 0.8983,
"lines_covered": 7058,
"lines_valid": 7857,
"modules_ok": 41,
"modules_total": 41
"files_tested": 47,
"files_untested": 164,
"func_rate": 0.9324,
"funcs_covered": 538,
"funcs_valid": 577,
"line_rate": 0.8993,
"lines_covered": 7132,
"lines_valid": 7931,
"modules_ok": 42,
"modules_total": 42
},
"untested_sources": [
{
@@ -768,7 +784,7 @@
"path": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c"
},
{
"code_lines": 407,
"code_lines": 420,
"path": "App/app/ui_data_feed.c"
},
{
@@ -796,7 +812,7 @@
"path": "Drivers/BSP/SD2506/sd2506.c"
},
{
"code_lines": 249,
"code_lines": 263,
"path": "App/task/adc_task.c"
},
{
@@ -815,6 +831,10 @@
"code_lines": 206,
"path": "Drivers/BSP/CH395F/ch395f.h"
},
{
"code_lines": 206,
"path": "Drivers/BSP/UI/ui_data.h"
},
{
"code_lines": 205,
"path": "Drivers/BSP/UI/ui_page_net_cfg.c"
@@ -827,14 +847,14 @@
"code_lines": 200,
"path": "Drivers/BSP/UI/ui_w_ytview.c"
},
{
"code_lines": 196,
"path": "Drivers/BSP/UI/ui_data.h"
},
{
"code_lines": 157,
"path": "Drivers/BSP/TPAFE5160/tpafe5160.c"
},
{
"code_lines": 152,
"path": "Drivers/BSP/UI/ui_page_runreport.c"
},
{
"code_lines": 150,
"path": "Drivers/BSP/UI/ui_page_password.c"
@@ -844,12 +864,12 @@
"path": "Drivers/BSP/UI/ui_page_device_info.c"
},
{
"code_lines": 134,
"path": "App/task/protect_task.c"
"code_lines": 135,
"path": "App/app/app_main.c"
},
{
"code_lines": 132,
"path": "App/app/app_main.c"
"code_lines": 134,
"path": "App/task/protect_task.c"
},
{
"code_lines": 129,
@@ -999,6 +1019,10 @@
"code_lines": 40,
"path": "Drivers/BSP/UI/ui_page_deadband.c"
},
{
"code_lines": 36,
"path": "Drivers/BSP/ScreenLink/sb_proto.h"
},
{
"code_lines": 36,
"path": "Drivers/BSP/UI/ui_w_records.h"
@@ -1115,6 +1139,18 @@
"code_lines": 22,
"path": "Drivers/BSP/NETCFG/ftp_cfg.h"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_accident.c"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_alarm.c"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_oper.c"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_runlog.c"
@@ -1127,6 +1163,14 @@
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_soe.c"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_start.c"
},
{
"code_lines": 22,
"path": "Drivers/BSP/UI/ui_page_yk.c"
},
{
"code_lines": 20,
"path": "Drivers/BSP/UI/ui_net_sink.h"
@@ -1339,6 +1383,14 @@
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_ac.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_accident.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_alarm.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_dc.h"
@@ -1347,6 +1399,22 @@
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_device_info.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_oper.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_runreport.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_start.h"
},
{
"code_lines": 5,
"path": "Drivers/BSP/UI/ui_page_yk.h"
},
{
"code_lines": 4,
"path": "Drivers/BSP/UI/ui_page_runlog.h"