at_cmd.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**
  2. * @file at_cmd.h
  3. * @brief AT命令驱动核心 - 重构版(安全架构)
  4. * @note 移除函数指针回调,采用查询模式,天然安全
  5. * 简化状态机,增加边界检查,防止IBUSERR和缓冲区溢出
  6. */
  7. #ifndef __AT_CMD_H__
  8. #define __AT_CMD_H__
  9. #include <rtthread.h>
  10. #include <stdint.h>
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. /* ==================== 配置 ==================== */
  15. #define AT_RSP_BUF_SIZE 1024 /* 响应缓冲区大小 */
  16. #define AT_CMD_BUF_SIZE 256 /* 命令缓冲区大小 */
  17. #define AT_URC_MAX_NUM 16 /* 最大URC数量 */
  18. #define AT_URC_MAX_LEN 32 /* URC前缀最大长度 */
  19. /* ==================== 结果枚举 ==================== */
  20. typedef enum {
  21. AT_RESULT_IDLE = 0, /* 空闲 */
  22. AT_RESULT_OK, /* 成功 */
  23. AT_RESULT_ERROR, /* 错误 */
  24. AT_RESULT_TIMEOUT, /* 超时 */
  25. AT_RESULT_CME_ERROR, /* CME错误 */
  26. AT_RESULT_CMS_ERROR, /* CMS错误 */
  27. AT_RESULT_ABORT /* 中止 */
  28. } at_result_t;
  29. /* ==================== 状态枚举 ==================== */
  30. typedef enum {
  31. AT_STATE_IDLE = 0, /* 空闲 */
  32. AT_STATE_SENDING, /* 发送中 */
  33. AT_STATE_WAITING, /* 等待响应 */
  34. AT_STATE_DONE /* 完成 */
  35. } at_state_t;
  36. /* ==================== URC回调类型 ==================== */
  37. typedef void (*at_urc_cb_t)(const char *data, uint16_t len);
  38. /* ==================== 命令结构 ==================== */
  39. /**
  40. * @brief AT命令项
  41. * @note 简化设计,移除函数指针回调,改为查询模式
  42. */
  43. typedef struct {
  44. const char *cmd; /* 命令字符串(必须以\r\n结尾) */
  45. const char *expect_ok; /* 期望的成功响应(可为NULL) */
  46. const char *expect_error; /* 期望的错误响应(可为NULL) */
  47. uint16_t timeout_ms; /* 超时时间(毫秒) */
  48. uint8_t retries; /* 重试次数 */
  49. } at_cmd_item_t;
  50. /* ==================== API接口 ==================== */
  51. /**
  52. * @brief 初始化AT命令模块
  53. * @param uart_name UART设备名,如"uart2"
  54. * @return 0成功,其他失败
  55. */
  56. int at_init(const char *uart_name);
  57. /**
  58. * @brief 反初始化AT命令模块
  59. */
  60. void at_deinit(void);
  61. /**
  62. * @brief 发送AT命令(异步)
  63. * @param cmd 命令结构体指针
  64. * @return 0成功启动,其他失败
  65. * @note 调用后需轮询at_process()或等待at_get_result()返回非IDLE
  66. * 此函数不会阻塞,立即返回
  67. * cmd的生命周期必须保持到命令完成(可指向静态或全局变量)
  68. */
  69. int at_exec_cmd(const at_cmd_item_t *cmd);
  70. /**
  71. * @brief 发送原始数据
  72. * @param data 数据指针
  73. * @param len 数据长度
  74. * @return 实际发送字节数
  75. */
  76. int at_send_raw(const uint8_t *data, uint16_t len);
  77. /**
  78. * @brief 主处理函数
  79. * @note 必须在主循环或独立线程中定期调用,建议100ms周期
  80. * 驱动状态机运行,处理接收数据
  81. */
  82. void at_process(void);
  83. /**
  84. * @brief 获取当前执行结果
  85. * @return 结果状态
  86. * @note 返回AT_RESULT_IDLE表示命令仍在执行中
  87. * 返回其他值表示命令已完成,可获取响应
  88. */
  89. at_result_t at_get_result(void);
  90. /**
  91. * @brief 获取响应缓冲区
  92. * @return 响应字符串指针(以\0结尾)
  93. * @note 仅在at_get_result()返回非IDLE时有效
  94. * 缓冲区内容在下次调用at_exec_cmd()前有效
  95. */
  96. const char* at_get_response(void);
  97. /**
  98. * @brief 获取当前状态
  99. * @return 当前状态
  100. */
  101. at_state_t at_get_state(void);
  102. /**
  103. * @brief 中止当前命令
  104. */
  105. void at_abort_cmd(void);
  106. /**
  107. * @brief 注册URC处理函数
  108. * @param prefix URC前缀,如"+QMTRECV:""
  109. * @param callback 回调函数
  110. * @return 0成功,其他失败(URC表已满)
  111. * @note URC(非请求结果码)是模块主动上报的数据
  112. * 此回调在中断上下文或at_process上下文中调用,需快速处理
  113. */
  114. int at_register_urc(const char *prefix, at_urc_cb_t callback);
  115. /**
  116. * @brief 注销URC处理函数
  117. * @param prefix URC前缀
  118. */
  119. void at_unregister_urc(const char *prefix);
  120. /**
  121. * @brief 清除响应缓冲区
  122. */
  123. void at_clear_response(void);
  124. /**
  125. * @brief 设置调试输出开关
  126. * @param enable 0关闭,1开启
  127. */
  128. void at_set_debug(uint8_t enable);
  129. /**
  130. * @brief 获取最后一条错误信息
  131. * @return 错误信息字符串(如"+CME ERROR: 3")
  132. */
  133. const char* at_get_error_info(void);
  134. #ifdef __cplusplus
  135. }
  136. #endif
  137. #endif /* __AT_CMD_H__ */