V1.5: 蓝牙AT设置加固(AT窗口静音日志防污染+进AT模式3轮重试)

This commit is contained in:
helei 2026-08-22 20:20:53 +08:00
parent 1198ca6763
commit 3d3311b130
4 changed files with 46 additions and 21 deletions

View File

@ -43,8 +43,17 @@ void log_set_level(LogLevel level)
}
/* Output log message via USART1 (HAL) */
static volatile uint8_t s_log_mute = 0;
/* AT 窗口静音BLE 模块与日志共用 UART1AT 交互期间日志字节会污染模块命令解析 */
void log_mute(uint8_t on)
{
s_log_mute = on;
}
static void _log_print(LogLevel level, const char *tag, const char *fmt, va_list args)
{
if (s_log_mute) return;
if (current_level <= level) {
char buf[256];
int len = vsnprintf(buf, sizeof(buf) - 2, fmt, args);

View File

@ -17,7 +17,8 @@ typedef enum {
void log_set_level(LogLevel level); /* 改等级并落 EEPROM */
void log_load_level(void);
LogLevel log_get_level(void); /* 开机读取保存的日志等级 */
void log_lock_init(void); /* 日志互斥锁初始化(调度器启动前调用一次) */
void log_lock_init(void);
void log_mute(uint8_t on); /* AT 窗口静音BLE 设置期间暂停日志输出) */ /* 日志互斥锁初始化(调度器启动前调用一次) */
void log_debug(const char *fmt, ...);
void log_info(const char *fmt, ...);

View File

@ -99,7 +99,12 @@ void ble_setup_name(void)
return;
}
/* 查询当前名称 */
/* AT 窗口内静音日志UART1 与模块共用,日志字节会污染模块的 AT 命令解析 */
log_mute(1);
/* 进 AT 模式并查询当前名称:无应答则重新拉 PC5 再试,最多 3 轮 */
const char *cur = NULL;
for (int round = 0; round < 3 && !cur; round++) {
BLE_PC5_LOW();
ble_delay(1100); /* 拉低 1s 进 AT 模式 */
BLE_PC5_HIGH();
@ -107,26 +112,34 @@ void ble_setup_name(void)
ble_flush_rx();
HAL_UART_Transmit(&huart1, (uint8_t *)"AT+NAME=?\r\n", 12, 500);
const char *cur = NULL;
int t = 30;
while (t-- > 0 && !cur) {
ble_delay(50);
cur = USART1_GetCommand();
}
}
if (cur && strstr(cur, BLE_NAME) && pwr_cache == BLE_TX_POWER) {
/* 名称与功率都正确:直接回透传,不动任何设置 */
log_info("> BLE: 名称已是 %s无需设置", BLE_NAME);
ble_at_cmd("AT+TS=1", "OK", 1500);
if (!cur) {
log_mute(0);
log_warn("> BLE: 3 轮 AT 均无应答(模块未接/被手机占用/PC5 未拉低)");
return;
}
if (cur && strstr(cur, BLE_NAME)) {
if (strstr(cur, BLE_NAME) && pwr_cache == BLE_TX_POWER) {
/* 名称与功率都正确:直接回透传,不动任何设置 */
ble_at_cmd("AT+TS=1", "OK", 1500);
log_mute(0);
log_info("> BLE: 名称已是 %s无需设置", BLE_NAME);
return;
}
if (strstr(cur, BLE_NAME)) {
/* 名称对但功率变了:只重设发射功率 */
snprintf(cmd, sizeof(cmd), "AT+RFPOWER=%d", BLE_TX_POWER);
ble_at_cmd(cmd, "OK", 1500);
ble_at_cmd("AT+REBOOT=1", "OK", 1500);
uint8_t p = BLE_TX_POWER;
eepromWriteData(BLE_POWER_ADDR, &p, 1);
log_mute(0);
log_info("> BLE: 发射功率已设置为 %d", BLE_TX_POWER);
return;
}
@ -149,9 +162,6 @@ void ble_setup_name(void)
ble_at_cmd(cmd, "OK", 1500);
snprintf(cmd, sizeof(cmd), "AT+UUIDW=%s", BLE_UUID_RX);
ble_at_cmd(cmd, "OK", 1500);
log_info("> BLE: 名称与 UUID 已设置完成");
#else
log_info("> BLE: 名称已设置为 %s", BLE_NAME);
#endif
/* 顺带设置发射功率 */
snprintf(cmd, sizeof(cmd), "AT+RFPOWER=%d", BLE_TX_POWER);
@ -167,9 +177,12 @@ void ble_setup_name(void)
uint8_t p = BLE_TX_POWER;
eepromWriteData(BLE_POWER_ADDR, &p, 1);
}
log_mute(0);
log_info("> BLE: 名称/UUID/功率已设置完成");
} else {
log_warn("> BLE: 设置名称失败(模块未接或应答异常)");
ble_at_cmd("AT+TS=1", "OK", 1500); /* 确保回到透传 */
log_mute(0);
log_warn("> BLE: 设置名称失败(模块未接或应答异常)");
}
}

View File

@ -202,3 +202,5 @@
过程DWT 硬件观察点抓到合法写点无误,定位为原中断接收路径在特定时序下字节丢失
- 恢复 OLED 防烧屏像素偏移每10s 右移 0/2/4px并修复左侧残留移位前先写空格清腾空列
- OLED 偏移幅度加大到 0~24px5 档),按内容宽度自动钳位不越界,左侧腾空列全量清空
- 蓝牙 AT 设置加固AT 窗口内静音日志UART1 与模块共用,日志字节会污染模块命令解析);
进 AT 模式+查询无应答时重新拉 PC5 重试,最多 3 轮