一、嵌入式工程师如何面对AI?
AI正在深刻改变软件开发方式。对于嵌入式工程师而言,AI并非威胁,而是提升效率的利器。关键在于理解AI的能力边界,并将其融入现有工作流。
核心原则
- AI擅长:编写、调试、维护代码这类“战术性”工作
- 人类聚焦:系统架构设计、战略决策、软硬件协同优化
- 价值护城河:对物理世界交互、硬件边界条件的深刻理解
推荐学习路径
- 夯实基础:深入STM32/Linux嵌入式项目实践
- 补充Python及常用库(Numpy、Pandas),为AI数据处理做准备
- 学习TinyML,将AI模型部署到低功耗MCU
- 实践Agent开发,从低代码平台开始
- 构建“云-边-端”智能系统,实现端侧AI部署
二、AI Agent、Skill、MCP的概念与关系
2.1 AI Agent(智能体)
定义:以LLM为“大脑”,具备记忆、规划、工具调用能力的自主执行单元。
类比:一位总指挥,接收高层任务(如“测试串口通信”),自主分解步骤,调用合适工具,并根据反馈调整策略。
特点:
- 推理资源消耗较高
- 适应性强,能处理未预见的异常
- 可调用Skill和MCP Server完成具体动作
2.2 Skill(技能)
定义:一个声明式的标准化操作流程(SOP),通常以Markdown文本文件形式存在。
类比:操作手册或备忘单。当Agent需要完成特定任务(如“测试串口”)时,它读取Skill文档,按步骤执行。
特点:
- 轻量、快速、可复用
- 不直接操作硬件,而是指导Agent调用哪些MCP工具
- 通过关键词或用户指令触发
2.3 MCP(Model Context Protocol)
定义:一个开放标准的应用层协议,定义了AI与外部工具/资源之间的通信方式及工具描述格式。
类比:一个“万能遥控器”的通信协议。Agent通过MCP协议控制MCP Server(实际干活的程序),MCP Server再操作硬件或系统资源。
核心要素:
- MCP Server:独立的用户态进程,封装具体功能(如串口读写、SSH执行)。运行在与Agent相同或不同的主机上。
- 传输方式:常用stdio(本地进程间通信)或HTTP(远程服务)。
- 工具描述:MCP Server会列出所有可用工具及其参数、说明,供Agent理解调用。
MCP vs RESTful API:MCP专为LLM设计,工具描述包含自然语言说明,AI无需预训练即可理解如何调用。
2.4 三者关系总结
| 组件 | 角色 | 表现形式 | 生命周期 |
|---|---|---|---|
| Agent | 总指挥 | 推理引擎 + 记忆 + 规划 | 持续运行(会话级) |
| Skill | SOP手册 | .md文本文件 | 被Agent读取时生效 |
| MCP Server | 执行工具 | 独立进程 | 由Agent启动或常驻 |
协作流程:用户下达任务 → Agent理解并规划 → 读取对应Skill获取步骤 → 按步骤调用MCP Server提供的工具 → MCP Server执行具体操作(读写串口、SSH命令等)→ 结果返回Agent → Agent判定并生成报告。
已在笔记中新增「深入理解Agent」与「深入理解Skill」两个独立章节,使其与MCP内容更加均衡。整体结构保持不变,确保逻辑连贯且无个人信息残留。
三、深入理解Agent
Agent并非简单的大模型“包装壳”,而是一个具备自主闭环能力的智能体。其核心运行机制可归纳为 P-E-O-R循环:
- 规划:将用户的高层目标分解为若干可执行的子任务。
- 执行:调用工具(如MCP Server、代码执行器、API等)完成任务。
- 观察:接收工具返回的结果或环境反馈。
- 反思:根据观察结果判断是否达成目标;若未达成,则重新规划。
3.1 Agent的四大核心组件
- 大模型(大脑):负责推理、生成计划和决策。
- 记忆:
- 短期记忆:当前会话的上下文信息(对话历史、任务状态)。
- 长期记忆:跨会话持久化的知识(向量数据库、文件、外部存储)。
- 工具集:Agent可调用的外部能力,通过MCP或内置函数暴露。
- 规划模块:将复杂任务拆解为行动序列,支持动态调整。
3.2 Agent与普通LLM的区别
| 能力 | 普通LLM | Agent |
|---|---|---|
| 对话 | ✅ | ✅ |
| 一次任务执行 | ✅(需人工分步引导) | ✅(自主完成全流程) |
| 工具调用 | 受限或需手动编写代码 | ✅(通过MCP标准化调用) |
| 错误恢复 | ❌ | ✅(观察→反思→重试/改方案) |
| 跨会话记忆 | ❌ | ✅(借助长期记忆) |
3.3 Agent的典型应用场景(嵌入式领域)
- 自动化测试:烧录代码 → 运行测试 → 读取日志 → 判断通过率 → 生成报告。
- 固件调试:通过JTAG/SWD读取内存 → 分析异常栈 → 定位bug → 提出修复建议。
- 硬件验证:控制信号发生器 → 读取示波器数据 → 比对时序 → 标注异常波形。
四、深入理解Skill
Skill是为Agent编写的标准化操作流程文档,通常以Markdown(或YAML frontmatter + Markdown正文)格式存储。它告诉Agent:“当用户提到X场景时,请按照Y步骤执行,并注意Z事项”。
4.1 Skill的本质:上下文注入
Skill并非可执行代码,而是一段在运行时动态注入Agent系统提示词或上下文的文本。Agent读取Skill后,会将其中描述的步骤当作“行为准则”来遵循。
与普通Prompt的区别:
- Prompt:一次性指令,每次对话需重新描述。
- Skill:可复用、可版本管理、支持参数化,且能组合使用。
4.2 一个标准Skill的结构
---
name: skill-name
description: 简短描述,用于Agent判断何时调用
---
# 技能标题
## 前置条件
- 需要用户提供的参数
## 执行步骤
1. 第一步:调用具体MCP工具或内置能力
2. 第二步:根据上一步结果做判断
3. ...
## 输出格式
要求Agent以特定模板输出结果
## 异常处理
遇到XX错误时,应该怎么做
4.3 Skill的触发方式
- 显式调用:用户指令中包含技能名称(如“执行embedded-test技能”)。
- 自动匹配:Agent根据用户自然语言描述,检索最相关的Skill并主动加载(需嵌入向量检索或关键词匹配)。
- Slash Command:通过快捷命令(如 /test-uart)触发,可带参数。
4.4 编写高效Skill的最佳实践
- 步骤粒度适中:每一步应是Agent能直接调用一个MCP工具完成的原子操作。
- 包含判断分支:使用“若……则……否则……”描述异常流程。
- 提供示例:在Skill中加入输入/输出示例,减少Agent理解偏差。
- 参数化:使用 {{变量名}} 标记需要用户填充的内容。
- 明确失败处理:定义超时重试、错误上报等行为。
4.5 Skill与MCP、Agent的协作示例
假设Skill编写如下:
## 执行步骤
1. 调用 `serial_mcp` 的 `list_ports` 工具,获取可用串口列表。
2. 如果列表为空,则报告错误并终止。
3. 否则,选择第一个串口,调用 `open` 工具。
Agent在运行时会:
- 语义理解步骤1 → 构造MCP请求 {"tool": "list_ports"} → 发送给MCP Server
- 接收返回结果 → 判断是否为空 → 决定下一步
五、深入理解MCP
5.1 MCP不是什么?
- 不是硬件接口(SPI、I2C、USB协议)
- 不是驱动程序
- 不是Agent的内置模块
5.2 MCP Server如何运行?
- 位置:与Agent同一主机(本地工具)或远程服务器
- 启动方式:
- stdio模式:由Agent客户端根据配置文件在启动时或会话开始时自动拉起子进程,会话结束则终止
- HTTP模式:需单独部署为常驻服务,Agent通过HTTP调用
5.3 如何实现自定义MCP Server?
推荐框架:Python + FastMCP(极简装饰器模式)
示例:串口调试MCP Server(仅核心代码)
import serial
from fastmcp import FastMCP
mcp = FastMCP("MCU Debugger")
@mcp.tool
def uart_send(port: str, baudrate: int = 115200, command: str = "AT\r\n"):
"""向串口设备发送命令并等待响应"""
with serial.Serial(port, baudrate, timeout=2) as ser:
ser.write(command.encode())
response = ser.readline()
return response.decode().strip()
if __name__ == "__main__":
mcp.run(transport="stdio")
开发步骤:
- 编写核心功能函数(与普通脚本无异)
- 使用@mcp.tool装饰器注册工具,并写好文档字符串(AI会读取)
- 调用mcp.run(transport="stdio")启动服务
调试工具:MCP Inspector
npx @modelcontextprotocol/inspector python your_mcp_server.py
5.4 如何查找现有MCP服务?
- Awesome MCP Servers:GitHub社区维护列表
- MCP Registry:官方应用商店
- 关键词搜索:serial-mcp-server、ssh-mcp-server、modbus-mcp-server等
- 嵌入式相关:serial-tether、mcp2serial、ssh-mcp-py
六、组合项目:自动化串口通信测试环境
6.1 项目目标
搭建一个全自动闭环:ClaudeCode编写测试代码 → SSH登录开发板并烧录 → 运行程序 → 通过USB转串口收发数据 → AI自动验证结果。
┌─────────────────────────────────────────────┐
│ 你的 Ubuntu 主机 │
│ ┌──────────────┐ ┌───────────────┐ │
│ │ ClaudeCode │ │ MCP Server │ │
│ │ (Agent) │◄────►│ (独立进程) │ │
│ └──────────────┘ └───────┬───────┘ │
│ ▲ │ │
│ │ 读 Skill 文本 │ 通过 │
│ │ │ /dev/ttyUSB0 │
│ ┌──────┴──────┐ │ │
│ │ Skill 文件 │ ▼ │
│ │ (.md) │ ┌────────────┐ │
│ └─────────────┘ │ USB 串口线 │ │
│ └─────┬──────┘ │
└──────────────────────────────────┼───────────┘
│
┌────┴─────┐
│ Linux │
│ 硬件板子 │
└──────────┘

6.2 硬件拓扑
Ubuntu主机(运行ClaudeCode)
├─ USB转串口线 ──→ Linux开发板(UART)
└─ 网络SSH ──────→ 开发板(用于烧录和执行)
6.3 所需组件
| 类型 | 名称 | 用途 |
|---|---|---|
| MCP Server | ssh-mcp-server(Node版)或 ssh-mcp-py |
使AI能通过SSH执行命令、传输文件 |
| MCP Server | serial-mcp-server(实际命令为serial_mcp) |
使AI能操作本地USB串口设备 |
| Skill | embedded-test.md |
定义完整测试流程的“剧本” |
| Agent | ClaudeCode(已配置) | 总指挥 |
6.4 详细配置步骤
步骤1:安装MCP Server
# 串口MCP(注意实际可执行文件名为 serial_mcp)
uvx --from serial-mcp-server serial_mcp
# SSH MCP(Node版本,支持密码认证)
npx -y @davidfei/ssh-mcp-server --host <开发板IP> --username <用户名> --password <密码>
若遇到权限问题:`sudo usermod -a -G dialout $USER` 后注销重登录。
步骤2:配置ClaudeCode的MCP客户端
在项目根目录创建或编辑 .mcp.json:
{
"mcpServers": {
"ssh": {
"command": "npx",
"args": ["-y", "@davidfei/ssh-mcp-server", "--host", "192.168.1.100", "--username", "root", "--password", "123456"]
},
"serial": {
"command": "uvx",
"args": ["--from", "serial-mcp-server", "serial_mcp"]
}
}
}
重启ClaudeCode使配置生效。
步骤3:编写Skill文件
在 .claude/skills/ 目录下创建 embedded-test.md:
---
name: embedded-test
description: 自动完成嵌入式代码编写、SSH烧录、串口验证的完整闭环
---
# 嵌入式自动化测试 Skill
## 工作流
### 1. 代码生成
根据用户需求,编写一个串口测试程序。例如:程序监听串口,收到 "PING" 则回复 "PONG"。
### 2. 远程烧录
- 使用SSH MCP的 `exec` 工具将编译好的二进制文件传输至开发板(可用scp或直接写入)
- 执行烧录/运行命令(如 `chmod +x test && ./test &`)
### 3. 串口验证
- 调用串口MCP的 `list_ports` 确认设备路径
- 调用 `open` 打开 `/dev/ttyUSB0`,波特率115200
- 调用 `write` 发送 "PING\n"
- 调用 `read` 等待响应(超时2秒)
- 调用 `close` 关闭串口
### 4. 结果判定
比较实际响应是否等于预期 "PONG",生成测试报告。
步骤4:触发执行
向ClaudeCode发送指令:
“执行 embedded-test 技能,测试串口回环。开发板IP 192.168.1.100,用户名root,密码123456,串口 /dev/ttyUSB0,波特率115200。”
Agent将自动完成所有步骤,并输出类似以下的报告:
--- 自动化测试报告 ---
测试时间:2025-01-15 14:32:07
目标板IP:192.168.1.100
串口设备:/dev/ttyUSB0
发送指令:PING
预期响应:PONG
实际响应:PONG
测试结论:✔️ 通过
耗时:23.4秒
--------------------
6.5 可选优化:添加快捷命令
在 .claude/commands/ 下创建 /test-uart.md:
---
description: 一键触发嵌入式串口自动化测试
---
请执行embedded-test技能,开发板IP={{args}}。
之后只需输入 /test-uart 192.168.1.100 即可启动。
七、总结
- Agent:AI的大脑与执行器,适合复杂、多变的推理任务。
- Skill:固化经验的SOP文本,让Agent快速学会标准流程。
- MCP:连接AI与外部世界的标准协议,MCP Server是独立的功能进程。
- 嵌入式工程师的优势在于对硬件的深刻理解。通过将重复性工作(烧录、串口测试、日志分析)交给AI Agent + MCP,可以腾出精力专注在系统架构和软硬件协同创新上。
实践建议:从一个小型自动化测试场景开始,逐步构建自己的MCP Server和Skill库,将AI融入日常开发流。
夜雨聆风