freeRTOS操作系统机器人实现
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

184 lines
5.8 KiB

/******************************************************************************
版权所有 (C), 2018-2099, Radkil
******************************************************************************
文 件 名 : ATParser.h
版 本 号 : 初稿
作 者 : Radkil
生成日期 : 2026年3月14日星期六
最近修改 :
功能描述 : ATParser.c 的头文件
修改历史 :
1.日 期 : 2026年3月14日星期六
作 者 : Radkil
修改内容 : 创建文件
******************************************************************************/
/*----------------------------------------------*
* 外部变量说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 外部函数原型说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 内部函数原型说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 全局变量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 模块级变量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 常量定义 *
*----------------------------------------------*/
/*----------------------------------------------*
* 宏定义 *
*----------------------------------------------*/
#ifndef __ATPARSER_H__
#define __ATPARSER_H__
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
/*==============================================*
* include header files *
*----------------------------------------------*/
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
/*==============================================*
* constants or macros define *
*----------------------------------------------*/
#define AT_RX_BUFFER_SIZE 256 // 接收缓冲区大小
#define AT_CMD_MAX_LEN 64 // 单条命令最大长度
#define AT_MAX_RESPONSES 8 // 支持的最大响应回调数量
/**
* @brief AT 命令执行结果状态
*/
typedef enum {
AT_OK, // 成功
AT_ERROR, // 失败 (ERROR)
AT_TIMEOUT, // 超时
AT_BUSY, // 模块忙
AT_UNKNOWN // 未知响应
} at_status_t;
/**
* @brief 响应结构体
*/
typedef struct {
const char *prefix; // 响应前缀,例如 "+CSQ:" 或 "OK"
void (*callback)(const char *data, int len); // 匹配到该前缀时的回调
} at_response_item_t;
/**
* @brief AT 解析器主结构体
*/
typedef struct {
uint8_t rx_buffer[AT_RX_BUFFER_SIZE]; // 环形缓冲区
uint16_t head; // 写指针
uint16_t tail; // 读指针
char cmd_buffer[AT_CMD_MAX_LEN]; // 当前正在解析的命令缓冲
uint16_t cmd_len; // 当前命令长度
bool is_waiting_response; // 是否正在等待响应
uint32_t wait_start_time; // 等待开始的时间戳 (ms)
uint32_t timeout_ms; // 超时时间设置
at_status_t last_status; // 最后一次执行状态
// 注册的响应列表
at_response_item_t responses[AT_MAX_RESPONSES];
uint8_t response_count;
// 硬件抽象层回调 (用户需实现)
void (*hw_send)(const uint8_t *data, uint16_t len);
uint32_t (*hw_get_tick)(void); // 获取系统毫秒时间
} at_parser_t;
/*==============================================*
* project-wide global variables *
*----------------------------------------------*/
/*==============================================*
* routines' or functions' implementations *
*----------------------------------------------*/
/**
* @brief 初始化解析器
* @param parser 解析器实例指针
* @param send_cb 发送数据回调 (必须实现)
* @param tick_cb 获取时间戳回调 (必须实现)
*/
void at_parser_init(at_parser_t *parser,
void (*send_cb)(const uint8_t*, uint16_t),
uint32_t (*tick_cb)(void));
/**
* @brief 注册响应前缀和回调
* @param parser 解析器实例
* @param prefix 前缀字符串 (如 "+CSQ:")
* @param cb 回调函数,当收到该前缀时触发
* @return true 成功,false 列表已满
*/
bool at_parser_register_response(at_parser_t *parser, const char *prefix, void (*cb)(const char*, int));
/**
* @brief 将串口接收到的字节喂给解析器 (需在中断或轮询中调用)
* @param parser 解析器实例
* @param data 接收到的字节
*/
void at_parser_feed(at_parser_t *parser, uint8_t data);
/**
* @brief 发送 AT 命令并等待响应 (阻塞式)
* @param parser 解析器实例
* @param cmd 命令字符串 (不含 \r\n,函数会自动添加)
* @param timeout_ms 超时时间
* @return AT_OK, AT_ERROR, AT_TIMEOUT 等
*/
at_status_t at_parser_send_cmd(at_parser_t *parser, const char *cmd, uint32_t timeout_ms);
/**
* @brief 发送原始数据 (不等待响应,用于发送透传数据)
* @param parser 解析器实例
* @param data 数据
* @param len 长度
*/
void at_parser_send_raw(at_parser_t *parser, const uint8_t *data, uint16_t len);
/**
* @brief 后台处理函数 (需在主循环中调用,处理超时逻辑)
* @param parser 解析器实例
*/
void at_parser_process(at_parser_t *parser);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __ATPARSER_H__ */