嵌入式开发学习路线:从C语言到STM32物联网项目实战
很多初学者在接触嵌入式开发时常常感到迷茫面对众多的单片机型号、复杂的开发环境和深奥的硬件知识不知道从何入手。本文基于多年的嵌入式开发教学经验整理了一套系统化的学习路线从零基础到项目实战帮助大家少走弯路快速掌握嵌入式开发的核心技能。1. 嵌入式开发概述与学习价值1.1 什么是嵌入式开发嵌入式开发是指针对特定应用场景设计、开发和优化嵌入式系统的过程。嵌入式系统是以应用为中心以计算机技术为基础软硬件可裁剪对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统广泛应用于智能家居、工业控制、汽车电子、医疗设备、物联网等领域。从简单的智能手环到复杂的工业机器人都离不开嵌入式技术的支持。1.2 嵌入式开发的学习价值随着物联网和人工智能技术的快速发展嵌入式开发人才需求持续增长。掌握嵌入式开发技能不仅能够从事硬件设计、驱动开发、系统移植等专业技术岗位还能为智能硬件创业、产品研发提供坚实的技术基础。嵌入式开发涉及硬件和软件的深度融合学习过程中能够培养系统思维、解决问题的能力这些都是现代工程师的核心竞争力。2. 嵌入式开发学习路线规划2.1 阶段一C语言基础夯实C语言是嵌入式开发的基石必须扎实掌握。学习重点包括数据类型与变量#include stdio.h int main() { // 基本数据类型 int age 25; float salary 8000.50; double distance 12345.6789; char grade A; // 常量定义 const float PI 3.14159; printf(年龄: %d\n, age); printf(工资: %.2f\n, salary); return 0; }指针深入理解#include stdio.h void swap(int *a, int *b) { int temp *a; *a *b; *b temp; } int main() { int x 10, y 20; printf(交换前: x%d, y%d\n, x, y); swap(x, y); printf(交换后: x%d, y%d\n, x, y); // 数组与指针 int arr[5] {1, 2, 3, 4, 5}; int *ptr arr; for(int i 0; i 5; i) { printf(arr[%d] %d\n, i, *(ptr i)); } return 0; }结构体与位操作#include stdio.h // 寄存器位定义 typedef struct { unsigned int mode : 3; // 3位模式位 unsigned int enable : 1; // 1位使能位 unsigned int reserved : 4; // 4位保留位 } ControlRegister; int main() { ControlRegister reg; reg.mode 5; // 二进制101 reg.enable 1; // 使能 printf(寄存器值: mode%d, enable%d\n, reg.mode, reg.enable); return 0; }2.2 阶段二单片机基础知识单片机基本结构CPU中央处理单元执行指令RAM随机存储器存放临时数据ROM只读存储器存放程序代码I/O口输入输出接口连接外设定时器产生精确时间间隔中断系统处理紧急事件常见单片机对比单片机类型特点适用场景开发难度51单片机8位简单易学资料丰富入门学习简单控制简单STM3232位性能强大生态完善工业控制复杂应用中等ESP32集成Wi-Fi蓝牙性价比高物联网智能家居中等AVR8位低功耗稳定性好消费电子电池供电简单2.3 阶段三51单片机实战入门开发环境搭建安装Keil C51开发环境配置项目模板学习基本的编译、下载流程。GPIO控制实战#include reg52.h sbit LED P1^0; // 定义P1.0口连接LED sbit KEY P1^1; // 定义P1.1口连接按键 void delay_ms(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 114; j); } void main() { while(1) { if(KEY 0) { // 按键按下 LED 0; // LED亮 delay_ms(500); LED 1; // LED灭 delay_ms(500); } else { LED 1; // LED灭 } } }串口通信示例#include reg52.h void UART_Init() { SCON 0x50; // 模式1允许接收 TMOD 0x20; // 定时器1模式2 TH1 0xFD; // 波特率9600 TL1 0xFD; TR1 1; // 启动定时器1 } void UART_SendByte(unsigned char dat) { SBUF dat; while(!TI); TI 0; } void UART_SendString(unsigned char *str) { while(*str ! \0) { UART_SendByte(*str); } } void main() { UART_Init(); while(1) { UART_SendString(Hello Embedded!\r\n); delay_ms(1000); } }3. 嵌入式开发环境搭建3.1 开发工具选择集成开发环境(IDE)Keil MDKARM单片机开发首选IAR Embedded Workbench商业级开发环境STM32CubeIDESTM32官方免费IDEVS Code 插件轻量级跨平台方案调试工具ST-LinkSTM32调试下载器J-Link通用ARM调试器USB-TTL串口通信工具逻辑分析仪信号时序分析3.2 开发板选择建议入门级开发板STC89C52开发板价格便宜适合51单片机学习STM32F103C8T6最小系统板性价比高资源丰富Arduino Uno简单易用生态完善进阶开发板正点原子/野火STM32开发板资料齐全外设丰富ESP32开发板物联网项目首选Raspberry Pi PicoRP2040芯片性能强大4. STM32进阶开发实战4.1 HAL库开发模式工程创建流程使用STM32CubeMX图形化配置引脚和时钟生成基于HAL库的工程代码在IDE中编写业务逻辑编译下载到目标板GPIO控制示例#include main.h int main(void) { HAL_Init(); SystemClock_Config(); MX.c.ClockEnable(GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_5; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); } }ADC采样实战#include main.h ADC_HandleTypeDef hadc1; void ADC_Init(void) { hadc1.Instance ADC1; hadc1.Init.ScanConvMode ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode ENABLE; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion 1; HAL_ADC_Init(hadc1); } uint16_t Read_ADC(void) { HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 100); return HAL_ADC_GetValue(hadc1); }4.2 通信协议实战I2C通信OLED显示#include ssd1306.h void OLED_Init(void) { // I2C初始化 HAL_Delay(100); SSD1306_WRITECOMMAND(0xAE); // 关闭显示 SSD1306_WRITECOMMAND(0x20); // 内存地址模式 SSD1306_WRITECOMMAND(0x10); SSD1306_WRITECOMMAND(0xB0); SSD1306_WRITECOMMAND(0xC8); SSD1306_WRITECOMMAND(0x00); SSD1306_WRITECOMMAND(0x10); SSD1306_WRITECOMMAND(0x40); SSD1306_WRITECOMMAND(0x81); SSD1306_WRITECOMMAND(0xFF); SSD1306_WRITECOMMAND(0xA1); SSD1306_WRITECOMMAND(0xA6); SSD1306_WRITECOMMAND(0xA8); SSD1306_WRITECOMMAND(0x3F); SSD1306_WRITECOMMAND(0xA4); SSD1306_WRITECOMMAND(0xD3); SSD1306_WRITECOMMAND(0x00); SSD1306_WRITECOMMAND(0xD5); SSD1306_WRITECOMMAND(0xF0); SSD1306_WRITECOMMAND(0xD9); SSD1306_WRITECOMMAND(0x22); SSD1306_WRITECOMMAND(0xDA); SSD1306_WRITECOMMAND(0x12); SSD1306_WRITECOMMAND(0xDB); SSD1306_WRITECOMMAND(0x20); SSD1306_WRITECOMMAND(0xAF); } void OLED_ShowString(uint8_t x, uint8_t y, char *str) { // 字符串显示函数实现 }5. 物联网开发实战5.1 ESP32物联网应用Wi-Fi连接配置#include WiFi.h const char* ssid your_SSID; const char* password your_PASSWORD; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(1000); Serial.println(连接WiFi...); } Serial.println(WiFi连接成功); Serial.print(IP地址: ); Serial.println(WiFi.localIP()); } void loop() { // 主循环代码 }MQTT通信示例#include PubSubClient.h WiFiClient espClient; PubSubClient client(espClient); void callback(char* topic, byte* payload, unsigned int length) { Serial.print(消息到达 [); Serial.print(topic); Serial.print(] ); for (int i 0; i length; i) { Serial.print((char)payload[i]); } Serial.println(); } void reconnect() { while (!client.connected()) { Serial.print(尝试MQTT连接...); if (client.connect(ESP32Client)) { Serial.println(连接成功); client.subscribe(esp32/output); } else { Serial.print(失败, rc); Serial.print(client.state()); Serial.println( 5秒后重试); delay(5000); } } } void setup() { // WiFi连接代码 client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }6. 综合项目实战6.1 智能温湿度监测系统硬件组成STM32F103主控制器DHT11温湿度传感器OLED显示屏ESP8266 WiFi模块锂电池供电系统软件架构// 主程序框架 int main(void) { System_Init(); Sensor_Init(); Display_Init(); WiFi_Init(); while(1) { float temp Read_Temperature(); float humidity Read_Humidity(); Display_Data(temp, humidity); WiFi_Send_Data(temp, humidity); HAL_Delay(5000); // 5秒更新一次 } }数据处理算法// 温度数据滤波处理 #define FILTER_SIZE 5 float Temperature_Filter(float new_value) { static float buffer[FILTER_SIZE] {0}; static int index 0; static int count 0; buffer[index] new_value; index (index 1) % FILTER_SIZE; if(count FILTER_SIZE) count; float sum 0; for(int i 0; i count; i) { sum buffer[i]; } return sum / count; }6.2 智能小车控制系统电机驱动控制// L298N电机驱动控制 typedef struct { GPIO_TypeDef* IN1_Port; uint16_t IN1_Pin; GPIO_TypeDef* IN2_Port; uint16_t IN2_Pin; } Motor_TypeDef; void Motor_Forward(Motor_TypeDef* motor) { HAL_GPIO_WritePin(motor-IN1_Port, motor-IN1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(motor-IN2_Port, motor-IN2_Pin, GPIO_PIN_RESET); } void Motor_Backward(Motor_TypeDef* motor) { HAL_GPIO_WritePin(motor-IN1_Port, motor-IN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(motor-IN2_Port, motor-IN2_Pin, GPIO_PIN_SET); } void Motor_Stop(Motor_TypeDef* motor) { HAL_GPIO_WritePin(motor-IN1_Port, motor-IN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(motor-IN2_Port, motor-IN2_Pin, GPIO_PIN_RESET); }超声波避障算法float Get_Distance(void) { // 发送触发信号 HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); HAL_Delay(10); HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); // 等待回波信号 while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) GPIO_PIN_RESET); uint32_t start_time HAL_GetTick(); while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) GPIO_PIN_SET); uint32_t end_time HAL_GetTick(); float distance (end_time - start_time) * 0.034 / 2; // 计算距离 return distance; }7. 嵌入式开发常见问题与解决方案7.1 编译与下载问题常见编译错误及解决错误类型现象描述解决方案链接错误undefined reference检查库文件是否添加函数声明是否正确内存溢出Program size exceeds优化代码删除不必要的全局变量语法错误expected ; before检查代码语法特别是括号匹配头文件错误No such file or directory检查头文件路径设置下载调试问题排查检查硬件连接USB线、调试器连接是否可靠验证驱动安装设备管理器识别调试器确认芯片型号工程配置与实际芯片一致检查供电开发板供电电压和电流是否足够7.2 外设驱动问题GPIO配置注意事项// 正确的GPIO配置流程 void GPIO_Config(void) { // 1. 使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 2. 配置GPIO参数 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_5; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; // 3. 初始化GPIO HAL_GPIO_Init(GPIOA, GPIO_InitStruct); }串口通信调试技巧使用串口助手验证数据收发检查波特率设置是否一致验证数据位、停止位、校验位配置使用逻辑分析仪检查信号波形8. 嵌入式开发最佳实践8.1 代码规范与架构设计模块化编程实践// 头文件sensor.h #ifndef __SENSOR_H #define __SENSOR_H #include main.h typedef struct { float temperature; float humidity; uint8_t status; } Sensor_Data_t; void Sensor_Init(void); Sensor_Data_t Sensor_Read_Data(void); uint8_t Sensor_Check_Status(void); #endif // 源文件sensor.c #include sensor.h static Sensor_Data_t sensor_data; void Sensor_Init(void) { // 传感器初始化代码 sensor_data.temperature 0; sensor_data.humidity 0; sensor_data.status 0; } Sensor_Data_t Sensor_Read_Data(void) { // 读取传感器数据 return sensor_data; }错误处理机制typedef enum { ERROR_NONE 0, ERROR_SENSOR_TIMEOUT, ERROR_COMMUNICATION_FAIL, ERROR_MEMORY_ALLOC, ERROR_PARAM_INVALID } Error_Code_t; Error_Code_t Sensor_Read_With_Retry(float* temperature, float* humidity, uint8_t retry_count) { for(uint8_t i 0; i retry_count; i) { if(Sensor_Read(temperature, humidity) SENSOR_OK) { return ERROR_NONE; } HAL_Delay(100); } return ERROR_SENSOR_TIMEOUT; }8.2 性能优化技巧内存优化策略使用合适的数据类型根据数据范围选择uint8_t、uint16_t等避免内存碎片静态分配替代动态分配使用const修饰只读数据合理使用位域节省内存执行效率优化// 优化前的代码 for(int i 0; i 100; i) { array[i] i * 2; } // 优化后的代码 - 使用寄存器变量 register int i; for(i 0; i 100; i) { array[i] i 1; // 使用移位替代乘法 }8.3 调试与测试方法单元测试框架// 简单的单元测试宏 #define TEST_ASSERT(condition) \ do { \ if (!(condition)) { \ printf(测试失败: %s, 文件: %s, 行: %d\n, #condition, __FILE__, __LINE__); \ return -1; \ } \ } while(0) int test_gpio_function(void) { // 测试GPIO功能 GPIO_Init(); TEST_ASSERT(HAL_GPIO_ReadPin(TEST_PIN) GPIO_PIN_SET); return 0; }日志调试系统// 分级日志系统 typedef enum { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR } Log_Level_t; void log_message(Log_Level_t level, const char* format, ...) { if(level CURRENT_LOG_LEVEL) return; va_list args; va_start(args, format); switch(level) { case LOG_LEVEL_DEBUG: printf([DEBUG] ); break; case LOG_LEVEL_ERROR: printf([ERROR] ); break; // 其他级别处理 } vprintf(format, args); va_end(args); }通过系统化的学习路径和大量的实践项目配合科学的调试方法和代码规范嵌入式开发的学习之路将会更加顺畅。重要的是保持动手实践的习惯每个知识点都要通过实际代码来验证逐步积累项目经验。

相关新闻

Cursor快捷键速成手册:从入门到高手只需15分钟,附赠官方未公开的8个隐藏组合键

Cursor快捷键速成手册:从入门到高手只需15分钟,附赠官方未公开的8个隐藏组合键

更多请点击: https://intelliparadigm.com 第一章:Cursor快捷键速成手册:从入门到高手只需15分钟,附赠官方未公开的8个隐藏组合键 Cursor 作为基于 VS Code 深度定制的 AI 编程助手,其快捷键体系既兼容传统编辑习惯&a…

2026/8/23 10:12:30 阅读更多 →
CAN总线错误帧类型解析与诊断方法

CAN总线错误帧类型解析与诊断方法

1. CAN总线错误帧的五大类型解析在工业控制和汽车电子领域,CAN总线报错就像车辆仪表盘上的故障灯,不同闪烁模式对应不同问题。以下是五种核心错误帧的深度解读:1.1 位错误(Bit Error)当节点检测到总线电平与自身发送位…

2026/8/17 14:59:43 阅读更多 →
IMAP4rev1协议内部机制:多设备同步的核心秘密

IMAP4rev1协议内部机制:多设备同步的核心秘密

多设备邮件同步的核心矛盾集中在弱网重连后的状态一致性收敛与全量轮询带来的冗余流量损耗,POP3无状态下载模型彻底无法解决该问题,而IMAP有状态目录映射机制在解决同步问题的同时,引入了树形解析、状态冲突、增量计算的多层工程代价。一、设…

2026/8/19 22:26:23 阅读更多 →

最新新闻

GA-VisAgent:基于多智能体的代码生成与可视化交互学习系统

GA-VisAgent:基于多智能体的代码生成与可视化交互学习系统

1. 从“代码生成”到“可视化交互学习”:一个被忽视的鸿沟最近在跟几个做教育科技的朋友聊天,他们都在头疼同一个问题:现在市面上基于大模型的代码生成工具(比如GitHub Copilot、Cursor)确实很火,学生和初学…

2026/8/24 3:30:11 阅读更多 →
多智能体协作治理框架:构建安全可控的AI团队操作系统

多智能体协作治理框架:构建安全可控的AI团队操作系统

1. 项目概述:当大模型智能体开始“团队作战”最近在搞多智能体系统(Multi-Agent System, MAS)落地的朋友,估计都遇到过类似的头疼事:你手上有几个能力不错的大语言模型(LLM)智能体,想…

2026/8/24 3:30:11 阅读更多 →
C/C++结构体从入门到精通:数据封装、内存对齐与工程实践

C/C++结构体从入门到精通:数据封装、内存对齐与工程实践

1. 先搞清楚结构体到底解决什么问题,别急着背语法很多人一上来就翻书看struct怎么定义、怎么声明,结果学了一堆语法,真到写代码的时候还是懵。结构体最核心的价值,是把一堆零散但相关的数据,打包成一个整体来管理。举个…

2026/8/24 3:30:11 阅读更多 →
01-程序员的中医体质自测:你是哪一种代码体质

01-程序员的中医体质自测:你是哪一种代码体质

01-程序员的中医体质自测:你是哪一种代码体质 写代码久了,你有没有发现自己的身体好像也有了"版本号"?有人熬夜三天还能生龙活虎,有人吹会儿空调就感冒发烧;有人喝凉水都长肉,有人怎么吃都不胖。…

2026/8/24 3:30:11 阅读更多 →
AI模型路由器的设计与实现:为Agentic Tool Calling智能调度大语言模型

AI模型路由器的设计与实现:为Agentic Tool Calling智能调度大语言模型

1. 项目概述:当AI代理需要“思考”时,谁来为它选择最合适的“大脑”?最近在折腾AI代理(AI Agent)项目时,我遇到了一个挺有意思的瓶颈。我的代理能调用各种工具,比如查天气、发邮件、分析数据&am…

2026/8/24 3:30:10 阅读更多 →
【数据分享】3900家全国银行大全银行数据(1954-2026)

【数据分享】3900家全国银行大全银行数据(1954-2026)

而今天要限时免费分享的数据就是3900家全国银行大全银行数据(1954-2026) 数据介绍 数据概况数据名称:3900家全国银行大全银行数据(1954-2026)数据范围:3900家数据来源:国家企业信用信息公示系统…

2026/8/24 3:29:10 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →