当前位置: 首页 > news >正文

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

🧠关键词: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 电源管理系统,实现自动唤醒、周期性采样与低功耗运行。

相关文章:

  • 《Pytorch深度学习实践》ch3-反向传播
  • NX869NX874美光固态颗粒NX877NX883
  • AI助力软件开发 – 豆包+Trae CN开发体验
  • 盒子模型与页面布局基础
  • 【C语言预处理详解(上)】--预定义符号,#define定义常量,#define定义宏,带有副作用的宏参数,宏替换的规则,宏和函数的对比
  • 【2025年B卷】华为OD-100分-字符串重新排列、字符串重新排序
  • InlineHook的原理与做法
  • 无畏契约 directx runtime修复
  • 【技术支持】安卓开发中queryUsageStats不准确的问题
  • esp32关于PWM最清晰的解释
  • Ⅱ.计算机二级选择题(运算符与表达式)
  • EchoMimicV2:迈向引人注目、简化的半身人类动画
  • Fisher准则例题——给定样本数据
  • (Python)列表的操作(增删改查、排序)
  • 信息安全管理与评估2024山东卷WAF答案
  • 第七章.正则表达式
  • 车载软件更新 --- 数据完整性和正确性策略(数据验签事宜汇总)
  • 经典数学教材推荐(AI相关)
  • 《人性的弱点》能带给我们什么?
  • 构建高性能风控指标系统
  • wordpress文章刷新/厦门seo培训学校
  • 聊城集团网站建设价格/做seo前景怎么样
  • 重庆市区十大景点推荐/14个seo小技巧
  • 乌鲁木齐房产集团网站建设/百度售后服务电话
  • 外贸简单网站建设/百度人工客服电话是多少
  • 品牌网站建设框架/软文例文 经典软文范例