【Zephyr 系列 4】串口通信进阶:打造自己的 AT 命令框架

article/2025/6/30 12:44:31

🧠关键词:Zephyr、UART、串口通信、AT命令、Shell、RTOS
📌适合人群:希望开发设备控制协议、调试接口、CLI 命令的嵌入式开发者


🎯 本篇目标

  • 使用 Zephyr 提供的 UART API 与 Shell 模块

  • 实现一套可扩展的 AT+CMD 风格串口命令框架

  • 支持查询、设置两类命令:如 AT+LED=ONAT+STATUS?


📦 环境与硬件

项目描述
硬件STM32F103C8T6 / Arduino MEGA 等 Zephyr 支持平台
工具链Zephyr SDK + west
串口终端minicom / screen / serial monitor

🏗 项目结构

zephyr-atcmd/
├── app/
│   ├── src/
│   │   ├── main.c
│   │   ├── at_cmd.c
│   │   └── at_cmd.h
│   ├── prj.conf
│   └── CMakeLists.txt

🧠 思路简述

  • 使用 uart_poll_in() 从串口读取字符

  • 每次读取直到遇到 \n 为止,组成完整 AT 命令

  • 解析出命令类型(SET/READ)和参数

  • 通过 strcmp() 分发到相应 handler 函数处理


📄 main.c

#include "at_cmd.h"void main(void) {printk("AT Command Framework Start\n");at_cmd_init();while (1) {at_cmd_poll(); // 持续处理串口输入k_msleep(10);}
}

📄 at_cmd.h

#ifndef AT_CMD_H
#define AT_CMD_Hvoid at_cmd_init(void);
void at_cmd_poll(void);#endif // AT_CMD_H

📄 at_cmd.c

#include <zephyr.h>
#include <device.h>
#include <drivers/uart.h>
#include <string.h>
#include <stdio.h>
#include "at_cmd.h"#define BUF_SIZE 64
static char input_buf[BUF_SIZE];
static int input_pos = 0;
static const struct device *uart;void at_cmd_init(void) {uart = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));if (!device_is_ready(uart)) {printk("UART not ready\n");}
}static void handle_cmd(const char *cmd) {if (strcmp(cmd, "AT+LED=ON") == 0) {printk("LED turned ON\n");// todo: 实际控制 LED} else if (strcmp(cmd, "AT+LED=OFF") == 0) {printk("LED turned OFF\n");} else if (strcmp(cmd, "AT+STATUS?") == 0) {printk("STATUS: OK\n");} else {printk("ERR: Unknown command [%s]\n", cmd);}
}void at_cmd_poll(void) {uint8_t c;while (uart_poll_in(uart, &c) == 0) {if (c == '\r') continue;if (c == '\n') {input_buf[input_pos] = '\0';handle_cmd(input_buf);input_pos = 0;} else if (input_pos < BUF_SIZE - 1) {input_buf[input_pos++] = c;}}
}

📄 prj.conf

CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_PRINTK=y

🔌 测试串口命令

使用串口终端连接开发板,例如:

screen /dev/ttyUSB0 115200

尝试输入以下命令:

AT+LED=ON
AT+LED=OFF
AT+STATUS?
AT+FOO

输出结果类似:

LED turned ON
LED turned OFF
STATUS: OK
ERR: Unknown command [AT+FOO]

📚 拓展建议(进阶方向)

目标技术
添加 AT+PWM=xxx 控制参数提取与类型转换
支持 AT+RESET 重启 MCU调用 sys_reboot(SYS_REBOOT_COLD)
支持 JSON/Hex 等格式字符串预处理与编码解析
使用 ringbuffer 替代临时缓冲区增强稳定性和线程安全
将 Shell + AT 模块合并支持双模式:手动命令 / 系统调试

📦 下一篇预告:《使用定时器与低功耗控制优化你的 MCU 项目》

我们将使用 k_timer + Zephyr 电源管理系统,实现自动唤醒、周期性采样与低功耗运行。


http://www.hkcw.cn/article/LoYhjPDWhb.shtml

相关文章

Docker 镜像原理

目录 操作系统基础 Union FS(联合文件系统) 再看 Docker 镜像是什么 镜像实现原理 docker 镜像加载原理 docker 是操作系统层的虚拟化&#xff0c;所以 docker 镜像的本质是在模拟操作系统。我们先看下操作系统是什么。 操作系统基础 操作系统由&#xff1a;进程调度子系统、…

仓颉语言---Socket编程

一、什么是Socket编程&#xff1f; 1.定义 Socket&#xff08;套接字&#xff09;可以被理解为网络上两个进程之间通信的端点。它是网络通信的抽象表示&#xff0c;封装了底层网络协议的复杂性&#xff0c;为应用程序提供了一个简单统一的接口。 Socket 编程是一种网络编程范式…

格密码-LWE问题

格密码是一种备受关注的 PQC 算法&#xff0c;其安全性基于最坏情况下格问题的困难性&#xff0c;它是来自于 Regev 密码系统和 Lyubashevsky-Peikert-Regev 密码系统的思想。 2022 年&#xff0c;NIST 完成了 PQC 第三轮标准化过程&#xff0c;共有四种候选算法被选中进行标准…

力扣刷题Day 67:N 皇后(51)

1.题目描述 2.思路 方法1&#xff08;自己写的传统型回溯&#xff09;&#xff1a;将第一行的皇后依次放置在0 ~ n - 1上&#xff0c;可以发现0 ~ (⌊n / 2⌋ - 1)上的放置方案与⌈n / 2⌉ ~ (n - 1)上的放置方案是对称的&#xff0c;此外&#xff0c;如果n是奇数的话还需额外…

超级 AI 助手进阶攻略:Reflection 模式,开启 Agent 智能飞跃之旅

反思之言&#xff1a; 你有没有注意到&#xff0c;同样是AI&#xff0c;有些能帮你写代码、做决策&#xff0c;甚至聊人生&#xff1b;而有些却连基本的问题都答不对&#xff1f;这背后其实有一个关键差异&#xff1a;它会不会“反思”自己。 所谓Reflection&#xff08;反思…

[RoarCTF 2019]Easy Calc

查看源代码 <!--Ive set up WAF to ensure security.--> <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div …

【LLM】AI Agents vs. Agentic AI(概念应用挑战)

note AI Agent 已经可以自动感知环境、拆解任务、并灵活应对变化&#xff1b;与此同时&#xff0c;Agentic AI 又一次将“协作”提到新高度&#xff0c;让多个小团队般的 Agent 分工协作&#xff0c;共同实现“更高层次的目标”AI Agents 将在五个关键领域实现突破&#xff1a…

UE5 2D地图曝光太亮怎么修改

UE5 2D地图曝光怎么修改 在场景添加后期处理体积 修改后期处理体积Exposure曝光参数最大值最小值都改为0 勾选Infinite Extend 全地图范围应用此后期处理体积

pikachu通关教程-File Inclusion

文件包含漏洞 本地文件包含 http://127.0.0.1:1000/pikachu/vul/fileinclude/fi_local.php?filenamefile1.php&submit%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 首先我们把file1改成file2&#xff0c;发现切换成功 那我们可不可以上传本地文件呢&#xff0c;答案是肯定的&a…

树莓派实验

一、在树莓派上完成驱动程序控制的 PWM LED灯。 1.PWM概述 PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过调节信号脉冲宽度来模拟不同幅度模拟信号的技术。它通过周期性地改变信号的占空比&#xff08;即在一个信号周期内&#xff0c;高…

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 一、前言 图(1-1) HarmonyOS 的 ** 文档扫描控件(DocumentScanner)** 是 AI Vision Kit 提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。 其核心能力包括:扫描合同、…

volatile,synchronized,原子操作实现原理,缓存一致性协议

文章目录 缓存一致性协议&#xff08;MESI&#xff09;volatile1. volatile 的作用2.volatile的底层实现3,volatile 实现单例模式的双重锁&#xff08;面手写&#xff09; synchronized1,基本用法2,可重入性3,Java对象头4,实现原理&#xff08;1&#xff09;代码块同步的实现&a…

Arch安装botw-save-state

devkitPro https://blog.csdn.net/qq_39942341/article/details/148387077?spm1001.2014.3001.5501 cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 megaton https://blog.csdn.net/qq_39942341/article/details/148388164?spm…

15-2021剑侠情缘2-各种修复完善+虚拟机单机端+外网服务端整理+文本教程+视频教程

任务完善 泉州三大BOSS 剑荡燕云 藏剑 通天顶 梁上等————–

css使用scoped之后样式失效问题

项目中的vue代码原本用的style标签来写css&#xff0c;现在想改成<style langscss scoped>&#xff0c;但是改完之后发现样式不对&#xff1a; 原来是&#xff1a; 将style改成scoped之后变成了&#xff1a;检查发现是之前定义的一些变量无法被识别&#xff0c;导致这些样…

大模型的开发应用(六):使用 Xtuner QLoRA 微调模型

这里写目录标题 0 前言1 Xtuner 简介1.1 主要特点1.2 核心功能1.3 优势与不足1.4 安装 2 数据集格式2.1 开源数据集2.2 自定义数据集2.3 数据集存放位置 3 微调大模型3.1 Qwen1.5的QLoRA配置文件3.2 修改配置文件&#xff08;1&#xff09;PART 1 基本设置&#xff08;2&#x…

cursor如何开启自动运行模式

在Cursor中&#xff0c;开启自动运行模式即启用“Yolo Mode”&#xff0c;具体操作如下&#xff1a; 按下Ctrl Shift J&#xff08;Windows/Linux&#xff09;或Cmd Shift J&#xff08;Mac&#xff09;打开Cursor设置。导航到“Features”&#xff08;功能&#xff09;选…

Visual Studio 2022 加载解决方案缓慢

Visual Studio 2022 加载解决方案加载缓慢 1.进入工具选项卡2.修改环境中的预览功能3.修改文本编辑器中的C#对应的高级选项 1.进入工具选项卡 工具 -> 选项 2.修改环境中的预览功能 环境 -> 预览功能 -> 更快加载项目&#xff08;某些功能可能会延迟&#xff09; 3.…

基于TMC5160 StallGuard2技术的工件搬运与尺寸检测融合系统

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 90万阅读 1.6万收藏 1 系统设计目标与创新价值 在现代智能制造系统中&#xff0c;传统自动化产线面临一个普遍存在的技术痛点&#xff1a;工件搬运与尺寸检测通常需要分离的子系统完成。这种分离不仅增加了…

github 提交失败,连接不上

1. 第一种情况&#xff0c;开了加速器&#xff0c;导致代理错误 删除hosts文件里相关的github代理地址 2. 有些ip不支持22端口连接,改为443连接 ssh -vT gitgithub.com // 命令执行结果 OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 debug1: C…