#ifndef BLE_H #define BLE_H #include "stm32f1xx_hal.h" typedef enum{ BLE_INIT = 0, BLE_FIRST_CONECT, BLE_CONNECTED, BLE_READY, BLE_ERROR, BLE_SET, BLE_WAITTING }BLE_STATE; extern const char* ble_state_names[]; typedef enum { EXEC_STATE_IDLE = 0, EXEC_STATE_SEND_WAIT, EXEC_STATE_PROCESS_RESP, EXEC_STATE_ERROR } ExecState_t; extern const char* ble_sub_state_names[]; typedef enum { EXECUTOR_BUSY, // 执行中,尚未完成 EXECUTOR_DONE, // 整个序列执行成功 EXECUTOR_ERROR // 发生不可恢复错误,错误信息已保存在执行器中 } ExecutorResult_t; typedef enum { RECOVERY_TARGET_NONE = 0, RECOVERY_TARGET_RESTART_SEQ, // 重启当前序列(不在 BLE_SET 中执行,直接重置执行器) RECOVERY_TARGET_SW_RESET_MODULE, // 软件复位模块 RECOVERY_TARGET_FACTORY_RESET, // 恢复出厂设置 RECOVERY_TARGET_RECONFIG_UART, // 重新配置串口(直接操作硬件,不经过 BLE_SET) RECOVERY_TARGET_HARD_RESET_MODULE,// 硬件复位模块(直接操作引脚) RECOVERY_TARGET_SOFT_RESET_MCU, // 软件复位 MCU RECOVERY_TARGET_PANIC // 不可恢复 } RecoveryTarget_t; typedef struct { const char* cmd; const char* expected_resp; uint16_t timeout_ms; uint8_t retry_max; // 关键升级:一个用于生成动态命令参数的回调函数 int (*prepare_cmd)(const char* cmd_template, char* cmd_buf, int buf_size); // 可选升级:一个用于解析自定义响应的回调函数 int (*parse_resp)(const char* resp); } BleAtCmd_t; const BleAtCmd_t ble_init_sequence[] = { {"AT\\r\\n", "OK", 100, 3, NULL, NULL}, {"AT+TRANSPORT\\r\\n", "OK", 100, 3, NULL, NULL}, {"AT+TRANSPORT<%d>\\r\\n", "OK", 100, 3, set_trans_cmd, parse_trans_resp}, {"AT+DISC\\r\\n", "OK", 100, 3, NULL, NULL}, {"AT+TYPE\\r\\n", "OK", 100, 3, NULL, NULL}, // {"AT+TYPE<%x>\\r\\n", "OK", 100, 3, set_type_cmd, parse_type_resp}, {"AT+RESET\\r\\n", "OK", 100, 3, NULL, NULL}, {"AT+DEFAULT\\r\\n", "OK", 100, 3, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} // 结束标记 }; const BleAtCmd_t ble_first_connect_sequence[] = { {"AT\r\n", "OK", 100, 3, NULL, NULL}, {"AT+OPASS\\r\\n", "OK", 100, 3, NULL, parse_opass_resp}, {"AT+OPASS<%d>\\r\\n", "OK", 100, 3, set_opass_cmd, NULL}, {"AT+APASS\\r\\n", "OK", 100, 3, NULL, parse_apass_resp}, {"AT+APASS<%d>\\r\\n", "OK", 100, 3, set_apass_cmd, NULL}, {"AT+DIRADV\\r\\n", "OK", 100, 3, NULL, parse_diradv_cmd}, {"AT+DIRADV%d,%d,%s\\r\\n", "OK", 100, 3, prepare_diradv_cmd, NULL}, {NULL, NULL, 0, 0, NULL, NULL} // 结束标记 }; const BleAtCmd_t ble_connect_sequence[] = { {"AT\r\n", "OK", 100, 3, NULL, NULL}, {"AT+OPASS\\r\\n", "OK", 100, 3, NULL, parse_opass_resp}, {"AT+OPASS<%d>\\r\\n", "OK", 100, 3, set_opass_cmd, NULL}, {"AT+APASS\\r\\n", "OK", 100, 3, NULL, parse_apass_resp}, {"AT+APASS<%d>\\r\\n", "OK", 100, 3, set_apass_cmd, NULL}, {"AT+DIRADV\\r\\n", "OK", 100, 3, NULL, parse_diradv_cmd}, {"AT+DIRADV%d,%d,%s\\r\\n", "OK", 100, 3, prepare_diradv_cmd, NULL}, {NULL, NULL, 0, 0, NULL, NULL} // 结束标记 }; //software reset const BleAtCmd_t ble_reset_sequence[] = { {"AT+RESET\r\n", "OK", 100, 3, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} }; // reset to default const BleAtCmd_t ble_default_sequence[] = { {"AT+DEFAULT\r\n", "OK", 100, 3, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} }; // total reset sequence const BleAtCmd_t ble_full_set_sequence[] = { {"AT+DISC\r\n", "OK", 100, 3, NULL, NULL}, {"AT+RESET\r\n", "OK", 100, 3, NULL, NULL}, {"AT+DEFAULT\r\n", "OK", 100, 3, NULL, NULL}, {"AT+WHITELIST\r\n", "OK", 100, 3, NULL, NULL}, {"AT+NOTI\r\n", "OK", 100, 3, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} }; typedef struct { const BleAtCmd_t* sequence; // 当前正在执行的命令序列 uint16_t cmd_index; // 当前命令索引 uint8_t retry_cnt; // 当前命令已重试次数 uint32_t start_tick; // 命令发送时的时间戳 ExecState_t state; // 执行器状态:IDLE, SENDING, WAITING, DONE, ERROR uint8_t error_type; // ERR_TYPE_xxx int error_code; // 具体错误码(模块返回码或prepare返回值) uint16_t error_cmd_index; // 发生错误的命令索引 } CmdExecutor_t; typedef struct { // 连接参数 char mac_addr[13]; // 蓝牙MAC地址 "A1B2C3D4E5F6" uint8_t addr_type; // 地址类型 (0=public, 1=random) // 广播参数 (用于 AT+DIRADV 等) uint8_t adv_param; uint8_t adv_type; char target_mac[13]; // 定向广播的目标MAC // 白名单参数 (用于 AT+WHITELIST 等) uint8_t whitelist_count; char whitelist_macs[3][13]; // 假设最多3个白名单设备 // 通信参数 uint32_t baud_rate; // 波特率 uint8_t tx_power; // 发射功率 // 模块工作参数 uint8_t work_mode; // 透传模式等 char device_name[32]; // 设备名称 // ... 其他所有可能用到的参数 } BleGlobalConfig_t; BleGlobalConfig_t g_ble_config = { .mac_addr = "A1B2C3D4E5F6", .addr_type = 0, .adv_param = 0x10, .adv_type = 1, .target_mac = "FFFFFFFFFFFF", .baud_rate = 9600, .device_name = "MyBLEModule", }; // 错误码信息结构体 typedef struct { int code; // 错误码数字,如 101 const char* desc; // 错误描述,如 "参数错误" RecoveryTarget_t recovery_target; //store the target } BleErrorCodeInfo_t; // 错误码表(根据你的模块手册填充) BleErrorCodeInfo_t g_ble_error_table[] = { {101, "参数长度错误", RECOVERY_TARGET_RESTART_SEQ}, // 参数错,重试没用 {102, "参数格式错误", RECOVERY_TARGET_RESTART_SEQ}, // 状态错,需检查流程 {103, "参数数据异常", RECOVERY_TARGET_RESTART_SEQ}, // 可重试 {104, "指令错误", RECOVERY_TARGET_SW_RESET_MODULE}, // 可重试 }; typedef enum { ERR_TYPE_NONE = 0, ERR_TYPE_PREPARE_FAILED, // prepare_cmd 失败 ERR_TYPE_TIMEOUT_EXCEEDED, // 超时且重试耗尽 ERR_TYPE_PARSE_FAILED, // 解析返回-1且重试耗尽 ERR_TYPE_MODULE_ERROR, // 模块返回错误码且重试耗尽 // 可以按需添加 } ErrorType_t; typedef struct { ErrorType_t type; // 错误类型 uint8_t main_state; // 主状态值(例如 BLE_INIT) uint16_t cmd_index; // 发生错误的命令索引(仅当在初始化阶段有意义) int error_code; // 错误码(内部错误码或模块返回码) uint32_t timestamp; // 时间戳 uint8_t origin_state; // 原始状态(用于恢复后返回) } BleErrorInfo_t; BleErrorInfo_t g_ble_error = {0}; char ble_rx_buffer[256]; volatile uint8_t ble_cmd_rec_done; #endif