meter-protocol-serial
meter-protocol-serial
698/645 电表协议串口发帧与解析 Skill
触发时机
当用户需求涉及以下任一关键词时触发本 skill:
698、645、DL/T698、DL/T645OAD、DI串口发帧、组帧、COM口协议调试、回归测试发帧验证、读电表数据、写电表参数
功能概述
本 skill 提供统一的 698/645 电表协议组帧、发送、接收和解析能力:
- 只组帧模式(无 port 参数):输出组好的请求帧十六进制
- 串口闭环模式(有 port 参数):发送请求、接收响应、解析结果
使用方法
快速调用
Linux / macOS / 原生Python
# 645读数据(只组帧)
python3 $SKILL_DIR/scripts/protocol_cli.py proto=645 op=read di=00010000
# 645读数据(串口发送)
python3 $SKILL_DIR/scripts/protocol_cli.py port=/dev/ttyUSB0 proto=645 op=read di=00010000
# 698读数据
python3 $SKILL_DIR/scripts/protocol_cli.py proto=698 op=read oad=40010200
# 698设置参数
python3 $SKILL_DIR/scripts/protocol_cli.py proto=698 op=set oad=43000300 value=bool:true
Windows / WSL (重要差异)
WSL中使用Windows串口时,推荐走 Python 包装脚本,它会自动转成 python.exe + Windows 路径:
# WSL中访问Windows COM口(推荐方式:使用 Python 包装脚本)
python3 $SKILL_DIR/meter-cmd.py port=COM10 proto=645 op=read di=04000401
# 或者手动转换路径
SKILL_PATH=$(wslpath -w /home/xx/.agents/skills/meter-protocol-serial/scripts/protocol_cli.py)
python.exe "$SKILL_PATH" port=COM10 proto=645 op=read di=04000401
常见错误:
# 错误方式1(WSL Python无法访问Windows串口)
python3 protocol_cli.py port=COM10 ... # 会报错: No such file or directory
# 错误方式2(Windows Python无法直接访问WSL路径)
python.exe /home/xx/.../protocol_cli.py # 会报错: can't open file
WSL串口映射关系:
| Windows | WSL设备 |
|---|---|
| COM1 | /dev/ttyS1 |
| COM10 | /dev/ttyS10 |
Windows原生PowerShell/CMD:
# Windows直接运行(PowerShell)
python.exe C:\path\to\scripts\protocol_cli.py port=COM10 proto=645 op=read di=04000401
# Windows直接运行(CMD)
python C:\path\to\scripts\protocol_cli.py port=COM10 proto=645 op=read di=04000401
带断言的回归测试
# Linux/WSL通用(只组帧,无串口)
python3 $SKILL_DIR/scripts/protocol_cli.py proto=645 op=read di=00010000 expect=ack
# WSL+Windows串口(推荐直接走包装脚本)
python3 $SKILL_DIR/meter-cmd.py port=COM3 proto=645 op=read di=00010000 expect=ack
支持的协议
| 协议 | 操作 | 说明 |
|---|---|---|
| DL/T645-2007 | read | 读数据 |
| DL/T645-2007 | write | 写数据 |
| DL/T698.45 | read | GET.request.normal |
| DL/T698.45 | set | SET.request.normal |
输入参数
通用参数
| 参数 | 说明 | 示例 |
|---|---|---|
| proto | 协议类型 | 645 或 698 |
| op | 操作类型 | read / write / set |
| port | 串口(可选) | /dev/ttyUSB0 或 COM3 |
| timeout_ms | 超时时间 | 2000 |
| baud | 波特率 | 2400(645默认)、9600(698默认) |
| data_bits | 数据位 | 8 |
| parity | 校验位 | even / odd / none |
| stop_bits | 停止位 | 1 |
| expect | 断言条件 | ack / hex:0102 / bool:true / int:1 |
| decode_hint | 解码提示 | hex / ascii / uint16_le / uint32_le / bcd |
| note | 备注 | 任意文本 |
645专用参数
| 参数 | 说明 | 示例 |
|---|---|---|
| di | 数据标识(8位十六进制) | 00010000 |
| addr | 表地址(12位BCD) | 000000000001 |
| value | 写数据值 | hex:010203 / ascii:abc |
| fe_count | 前导FE个数 | 4 |
| raw_prefix | 前置数据 | hex:041234 |
| raw_suffix | 后置数据 | hex:0000 |
698专用参数
| 参数 | 说明 | 示例 |
|---|---|---|
| oad | 对象属性描述符(8位十六进制) | 40010200 |
| server_addr | 服务器地址 | 000000000000 |
| client_addr | 客户机地址 | 00 |
| ca | 客户机地址(缩写) | 00 |
| value | 写数据值 | bool:true / int32:123 / string:abc |
Value格式
645协议:
hex:01020304- 原始十六进制数据ascii:abc- ASCII字符串
698协议:
bool:true|false- 布尔值int8:1,int16:1,int32:1- 有符号整数uint8:1,uint16:1,uint32:1- 无符号整数enum:1- 枚举值octet:112233- 八位串(带长度前缀)string:abc- 可见字符串(带长度前缀)hex:010203- 原始十六进制(直接作为Data)
输出格式
MODE=frame_only|serial_roundtrip
PROTO=645|698
OP=read|write|set
TARGET=di:xxx|oad:xxx
REQUEST_HEX=68 AA AA ... CS 16
RESPONSE_HEX=68 BB BB ... CS 16 (串口模式)
FRAME_CHECK=ok|fail|partial
DECODE_STATUS=ok|partial|fail
RESULT=success|error|timeout
DATA_HEX=01020304
DATA_TYPED=typed_value (如果有)
ASSERT_RESULT=pass|fail|skipped
ASSERT_REASON=... (如果有)
SUMMARY=简短中文总结
645特有输出
645_ADDR=000000000001
645_CTRL=91
645_DI=00010000
698特有输出
698_SERVER_ADDR=45AAAAAAAAAAAA (地址特征字节+6字节地址)
698_CLIENT_ADDR=00
698_CTRL=43 (控制域: DIR=0,PRM=1,分帧=0,扰码=0,功能码=3)
698_PIID=00
698_OAD=40010200
698_DAR=00 (数据访问结果,00=成功)
退出码
| 码值 | 含义 |
|---|---|
| 0 | 成功 |
| 2 | 输入参数错误 |
| 3 | 串口打开或发送失败 |
| 4 | 超时无响应 |
| 5 | 收到响应但解析失败 |
| 6 | 断言失败 |
AI 使用建议
回复顺序
当用户使用本 skill 时,AI 应按以下顺序回复:
- 执行命令:给出实际执行的 CLI 命令
- 关键输出:摘出 REQUEST_HEX、RESULT、ASSERT_RESULT 等关键字段
- 简短解释:说明结果含义和下一步建议
示例场景
场景1:用户说"帮我组一个645读数据的帧"
执行命令:
python3 $SKILL_DIR/scripts/protocol_cli.py proto=645 op=read di=00010000
输出:
MODE=frame_only
PROTO=645
OP=read
TARGET=di:00010000
REQUEST_HEX=FEFEFEFE6800000000000068110433333333AD16
...
SUMMARY=组帧成功: FEFEFEFE6800000000000068110433...
场景2:用户说"验证COM3口能否读到数据"
执行命令:
python3 $SKILL_DIR/scripts/protocol_cli.py port=COM3 proto=645 op=read di=00010000 expect=ack
输出:
MODE=serial_roundtrip
PROTO=645
OP=read
...
ASSERT_RESULT=pass
SUMMARY=断言通过: 收到响应
注意事项
- port 参数可选:无 port 时进入只组帧模式,不会打开串口
- 地址默认值:
- 645默认地址
AAAAAAAAAAAA(12位BCD通配地址) - 698默认服务器地址
AAAAAAAAAAAA(6字节通配地址,地址特征字节=0x45),客户机地址00
- 645默认地址
- 波特率默认:645默认9600bps,698默认9600bps
- 超时处理:默认超时2000ms,可通过timeout_ms调整
- 断言失败:assert_result=fail时进程返回非零退出码,可用于脚本自动化
模块结构
scripts/
├── protocol_cli.py # CLI主入口
├── request_parser.py # 请求解析
├── profiles.py # 默认配置
├── serial_transport.py # 串口收发
├── proto_645.py # 645协议处理
├── proto_698.py # 698协议处理
├── value_codec.py # 值编解码
└── result_formatter.py # 结果格式化
第一版限制
- 698:不支持登录、链路建立、安全认证、安全传输
- 698:不支持 ACTION 和 ROAD
- 645:不做各类业务DI的专用语义解析
- 两个协议:仅支持标准明文读写,不支持厂商私有扩展
More from ruiwarn/skills
embedded-cross-review
Use when reviewing embedded or firmware code changes, especially in C/C++, bare-metal, RTOS, driver, ISR, DMA, boot, NFC, or other hardware-facing paths where cross-review can catch correctness, safety, and architecture-coupling issues
29github-search-before-code
Proactively search GitHub for reference implementations before writing new code. Use this skill when: (1) User requests implementing completely new functionality, algorithms, or modules that don't exist in the current codebase, (2) User mentions repeated failures with phrases like 'still not working', 'tried many times', 'still has problems', or (3) AI recognizes the need to implement unfamiliar or complex features. The skill helps avoid reinventing the wheel by finding and analyzing existing high-quality implementations, then adapting them to user needs.
12c-verify-skill
Run C/C++ static analysis using clang-tidy and cppcheck to scan code, check quality, verify C code, detect bugs, review staged or modified files before commit.
9zc-bug-fix
Use when the user asks to fix a bug, resolve an issue, or provides a bug URL/bug ID from 禅道, GitLab, GitHub, Jira, or similar systems; especially when the work needs a full workflow of reading the bug, fixing code, verifying, creating issue/MR, and writing status back to the tracker.
9git-staged-review-commit
PRIORITY: This skill OVERRIDES @oracle or @agent mentions when trigger phrases match. Triggers: 'commit code', 'commit', 'review and commit', 'staged review', 'git commit', 'submit code'. Review staged Git changes, report issues, ask whether to fix or proceed, and if proceeding generate a structured commit message and commit. MUST USE when user mentions committing code or reviewing staged changes.
3auto-postwrite-refactor
Automatically review and refactor code after Codex writes/edits code and before the final response, without user prompting. Use for any language to remove dead/garbage code, reduce cyclomatic complexity, merge duplicated logic, and right-size functions (not too long, not too tiny) while preserving behavior; add Chinese comments when helpful; output a change summary with reasons.
3