LoRa 无线对讲机-对讲机工作主要流程-开机

开机主流程:

【开机初始化自检流程】

  1. 用户长按电源键开机

↓

  1. 显示品牌Logo (约0.5秒)

↓

  1. 显示"自检中..." + 动态进度条

↓

  1. 步骤1: 读取工作状态 (0x0F 0x11)
  • 成功: 继续

  • 超时(1秒): 记录错误码1,继续

↓

  1. 步骤2: 读取工作模式 (0x03)
  • 成功且匹配: 继续

  • 成功但不匹配: 进入步骤3

  • 超时(1秒): 记录错误码2,继续

↓

  1. 步骤3: 写入工作模式 (0xC3) 仅当不匹配时
  • 成功: 继续

  • 超时(0.5秒): 记录错误码3,继续

↓

  1. 步骤4: 读取音量 (0x0F 0x5C)
  • 成功: 保存音量值,继续

  • 超时(1秒): 记录错误码4,继续

↓

  1. 步骤5: 读取电量 (0x0F 0x38)
  • 成功: 保存电量值,继续

  • 超时(1秒): 记录错误码5,继续

↓

  1. 步骤6: 读取MIC增益 (0x0F 0x42)
  • 成功: 保存MIC值,继续

  • 超时(1秒): 记录错误码6,继续

↓

  1. 步骤7-14: 检查4个信道 (循环)

每个信道:

  • 读取参数 (0x3F)

  • 匹配默认值 → 跳过

  • 不匹配 → 写入默认值 (0xCF)

  • 超时: 记录对应错误码,继续

↓

  1. 步骤15: 保存配置 (0x0F 0xDD)
  • 成功: 继续

  • 超时(0.5秒): 记录错误码15,继续

↓

  1. 自检完成,进入主界面

↓

  1. 显示结果:
  • 无错误: 正常显示

  • 有错误: 显示 "ERR!" 标志

详细叙述:

上电开机

│

├── 413ms后:模块主动上报工作状态 (0x12)

│

├── 长安poweran按键触发:MCU发送 0x0F 0x11 读取工作状态

│ │

│ ├── 状态 = 0 (待机) → 显示"空闲"图标

│ ├── 状态 = 1 (播放) → 显示"播放"图标

│ ├── 状态 = 2 (发射) → 显示"麦克风"图标

│ ├── 状态 = 3 (接收) → 显示"电话"图标

│ └── 其他状态 → 显示"主界面"图标

│

├── +300ms:MCU发送 0x03 读取工作模式

│ │

│ ├── 读取模式参数 (16字节)

│ │

│ └── 与默认值比较 → 不匹配则发送 0xC3 写入默认模式

│

├── +300ms:MCU发送 0x0F 0x5C 读取音量

│

├── +300ms:MCU发送 0x0F 0x38 读取电量

│

├── +300ms:MCU发送 0x0F 0x42 读取MIC增益

│

├── +300ms:MCU发送 0x3F 0x00 读取信道1

│ └── 不匹配默认值 → 发送 0xCF 0x00 写入默认信道1

│

├── +300ms:MCU发送 0x3F 0x01 读取信道2

│ └── 不匹配默认值 → 发送 0xCF 0x01 写入默认信道2

│

├── +300ms:MCU发送 0x3F 0x02 读取信道3

│ └── 不匹配默认值 → 发送 0xCF 0x02 写入默认信道3

│

├── +300ms:MCU发送 0x3F 0x03 读取信道4

│ └── 不匹配默认值 → 发送 0xCF 0x03 写入默认信道4

│

└── +300ms:MCU发送 0x0F 0xDD 保存配置

// 信道1

Channel = 0x00

Freq = 468588000 // 468.588 MHz

Target = 0x00

TXPower = 5 // 5 dBm

// 信道2

Channel = 0x01

Freq = 469376791 // 469.376791 MHz

Target = 0x00

TXPower = 10 // 10 dBm

// 信道3

Channel = 0x02

Freq = 470165582 // 470.165582 MHz

Target = 0x00

TXPower = 15 // 15 dBm

// 信道4

Channel = 0x03

Freq = 470954373 // 470.954373 MHz

Target = 0x00

TXPower = 20 // 20 dBm

示例:

开机操作流程MCU发送命令:

2026-07-22 20:30:52.296# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E

2026-07-22 20:30:52.598# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03

2026-07-22 20:30:52.911# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 53

2026-07-22 20:30:53.199# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 37

2026-07-22 20:30:53.515# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4D

2026-07-22 20:30:53.815# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F

2026-07-22 20:30:54.116# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E

2026-07-22 20:30:54.433# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D

2026-07-22 20:30:54.721# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C

2026-07-22 20:30:55.025# RECV HEX/36 <<<

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F DD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2

开机操作流程MCU接受命令:

2026-07-22 20:30:52.296# RECV HEX/22 <<<

00 00 55 0A 0F 11 00 10 12 1C 00 00 14 00 06 00 01 02 03 00 00 12

2026-07-22 20:30:52.598# RECV HEX/22 <<<

00 00 55 0A 03 33 01 10 04 02 78 03 01 00 06 00 01 02 03 00 00 5B

2026-07-22 20:30:52.911# RECV HEX/22 <<<

00 00 55 0A 0F 5C 0D 10 04 02 78 03 01 00 06 00 01 02 03 00 00 34

2026-07-22 20:30:53.215# RECV HEX/44 <<<

00 00 55 0A 0F 5C 0D 10 04 02 78 03 01 00 06 00 01 02 03 00 00 34 00 00 55 0A 0F 38 43 10 04 02 78 03 01 00 06 00 01 02 03 00 00 1E

2026-07-22 20:30:53.515# RECV HEX/22 <<<

00 00 55 0A 0F 42 04 10 04 02 78 03 01 00 06 00 01 02 03 00 00 23

2026-07-22 20:30:53.830# RECV HEX/22 <<<

00 00 55 0A 3F 00 E0 15 EE 1B 00 00 05 00 06 00 01 02 03 00 00 3C

2026-07-22 20:30:54.132# RECV HEX/22 <<<

00 00 55 0A 3F 01 17 1F FA 1B 00 00 0A 00 06 00 01 02 03 00 00 DB

2026-07-22 20:30:54.433# RECV HEX/22 <<<

00 00 55 0A 3F 02 4E 28 06 1C 00 00 0F 00 06 00 01 02 03 00 00 48

2026-07-22 20:30:54.721# RECV HEX/22 <<<

00 00 55 0A 3F 03 85 31 12 1C 00 00 14 00 06 00 01 02 03 00 00 94

2026-07-22 20:30:55.026# RECV HEX/22 <<<

00 00 55 0A 0F DD 85 31 12 1C 00 00 14 00 06 00 01 02 03 00 00 7A

2026-07-22 20:32:05.946# RECV HEX/22 <<<

00 00 55 0A 0F 38 4A 10 12 1C 00 00 14 00 06 00 01 02 03 00 00 71

示例代码:

复制代码
// ============================================================
// FSM.c - 顶部添加静态变量
// ============================================================
static uint8_t g_retry_count = 0;     // 重试计数


// ============================================================
// 主UI状态机
// ============================================================
void ui_render_all(void){
	 EventContext context;	 
	 uint32_t current_time = HAL_GetTick();
	
   switch((uint8_t)g_sys_state){
		// ============================================================
		// 开机
		// ============================================================
		case SYS_STATE_POWER_ON:
			 if (get_event(EVT_KEY_POWER_LONG_PRESS, &context)) //按键1秒开机,关键2秒关机
			 {
					// 上电显示开机Logo 
          HAL_GPIO_WritePin(POWER_ON_GPIO_Port, POWER_ON_Pin, GPIO_PIN_SET);				 
					draw_power_on_screen();					 
					g_retry_count = 0;  // 重置重试计数
					g_state_timer = current_time;
					g_sys_state = SYS_STATE_INIT_READ_STATUS;
			 }				 
				break;
			 
		// ============================================================
		// 初始化步骤1: 读取工作状态 (0x0F 0x11)
		// ============================================================
		case SYS_STATE_INIT_READ_STATUS:
				// 收到回复
				if (get_event(EVT_MODULE_STATUS_READ, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_MODE;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_work_status();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_MODE;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤2: 读取工作模式 (0x03)
		// ============================================================
		case SYS_STATE_INIT_READ_MODE:
				// 收到回复
				if (get_event(EVT_MODULE_MODE_READ, &context)) {
					g_retry_count = 0;
					if (context.is_match == 0) {
						// 匹配,进入下一步
						g_sys_state = SYS_STATE_INIT_READ_VOLUME;
						g_state_timer = current_time;
					} else {
						// 不匹配,写入默认工作模式
						send_cmd_set_work_mode();
						g_retry_count = 0;
						g_state_timer = current_time;
						g_sys_state = SYS_STATE_INIT_WRITE_MODE;
					}
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_work_mode();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_VOLUME;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤3: 写入工作模式 (0xC3)
		// ============================================================
		case SYS_STATE_INIT_WRITE_MODE:
				// 收到回复
				if (get_event(EVT_MODULE_MODE_WRITE, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_VOLUME;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_set_work_mode();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_VOLUME;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤4: 读取音量 (0x0F 0x5C)
		// ============================================================
		case SYS_STATE_INIT_READ_VOLUME:
				// 收到回复
				if (get_event(EVT_MODULE_VOLUME_READ, &context)) {
					g_volume = context.volume;
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_BATTERY;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_volume();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_BATTERY;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤5: 读取电量 (0x0F 0x38)
		// ============================================================
		case SYS_STATE_INIT_READ_BATTERY:
				// 收到回复
				if (get_event(EVT_MODULE_BATTERY_READ, &context)) {
					g_battery_voltage = context.battery_voltage;
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_MIC;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_battery();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_MIC;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤6: 读取MIC增益 (0x0F 0x42)
		// ============================================================
		case SYS_STATE_INIT_READ_MIC:
				// 收到回复
				if (get_event(EVT_MODULE_MIC_GAIN_READ, &context)) {
					g_mic_gain = context.mic_gain;
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_CH1;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_mic_gain();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH1;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤7: 读取信道1 (0x3F 0x00)
		// ============================================================
		case SYS_STATE_INIT_READ_CH1:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_READ, &context)) {
					g_retry_count = 0;
					if (context.is_match == 0) {
						// 匹配,进入下一信道
						g_sys_state = SYS_STATE_INIT_READ_CH2;
						g_state_timer = current_time;
					} else {
						// 不匹配,写入默认信道1
						send_cmd_write_channel(0, DEFAULT_CH1_FREQ, DEFAULT_CH1_TARGET, DEFAULT_CH1_POWER);
						g_retry_count = 0;
						g_state_timer = current_time;
						g_sys_state = SYS_STATE_INIT_WRITE_CH1;
					}
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_channel(0);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH2;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤8: 写入信道1 (0xCF 0x00)
		// ============================================================
		case SYS_STATE_INIT_WRITE_CH1:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_WRITE, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_CH2;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_write_channel(0, DEFAULT_CH1_FREQ, DEFAULT_CH1_TARGET, DEFAULT_CH1_POWER);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH2;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤9: 读取信道2 (0x3F 0x01)
		// ============================================================
		case SYS_STATE_INIT_READ_CH2:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_READ, &context)) {
					g_retry_count = 0;
					if (context.is_match == 0) {
						g_sys_state = SYS_STATE_INIT_READ_CH3;
						g_state_timer = current_time;
					} else {
						send_cmd_write_channel(1, DEFAULT_CH2_FREQ, DEFAULT_CH2_TARGET, DEFAULT_CH2_POWER);
						g_retry_count = 0;
						g_state_timer = current_time;
						g_sys_state = SYS_STATE_INIT_WRITE_CH2;
					}
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_channel(1);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH3;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤10: 写入信道2 (0xCF 0x01)
		// ============================================================
		case SYS_STATE_INIT_WRITE_CH2:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_WRITE, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_CH3;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_write_channel(1, DEFAULT_CH2_FREQ, DEFAULT_CH2_TARGET, DEFAULT_CH2_POWER);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH3;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤11: 读取信道3 (0x3F 0x02)
		// ============================================================
		case SYS_STATE_INIT_READ_CH3:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_READ, &context)) {
					g_retry_count = 0;
					if (context.is_match == 0) {
						g_sys_state = SYS_STATE_INIT_READ_CH4;
						g_state_timer = current_time;
					} else {
						send_cmd_write_channel(2, DEFAULT_CH3_FREQ, DEFAULT_CH3_TARGET, DEFAULT_CH3_POWER);
						g_retry_count = 0;
						g_state_timer = current_time;
						g_sys_state = SYS_STATE_INIT_WRITE_CH3;
					}
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_channel(2);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH4;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤12: 写入信道3 (0xCF 0x02)
		// ============================================================
		case SYS_STATE_INIT_WRITE_CH3:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_WRITE, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_READ_CH4;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_write_channel(2, DEFAULT_CH3_FREQ, DEFAULT_CH3_TARGET, DEFAULT_CH3_POWER);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_READ_CH4;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤13: 读取信道4 (0x3F 0x03)
		// ============================================================
		case SYS_STATE_INIT_READ_CH4:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_READ, &context)) {
					g_retry_count = 0;
					if (context.is_match == 0) {
						g_sys_state = SYS_STATE_INIT_SAVE_CONFIG;
						g_state_timer = current_time;
					} else {
						send_cmd_write_channel(3, DEFAULT_CH4_FREQ, DEFAULT_CH4_TARGET, DEFAULT_CH4_POWER);
						g_retry_count = 0;
						g_state_timer = current_time;
						g_sys_state = SYS_STATE_INIT_WRITE_CH4;
					}
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_get_channel(3);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_SAVE_CONFIG;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤14: 写入信道4 (0xCF 0x03)
		// ============================================================
		case SYS_STATE_INIT_WRITE_CH4:
				// 收到回复
				if (get_event(EVT_MODULE_CHANNEL_WRITE, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_SAVE_CONFIG;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_write_channel(3, DEFAULT_CH4_FREQ, DEFAULT_CH4_TARGET, DEFAULT_CH4_POWER);
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_SAVE_CONFIG;
						g_state_timer = current_time;
					}
				}
				break;
		 
		// ============================================================
		// 初始化步骤15: 保存配置 (0x0F 0xDD)
		// ============================================================
		case SYS_STATE_INIT_SAVE_CONFIG:
				// 收到回复
				if (get_event(EVT_MODULE_SAVE_CONFIG, &context)) {
					g_retry_count = 0;
					g_sys_state = SYS_STATE_INIT_COMPLETE;
					g_state_timer = current_time;
					break;
				}

				// 300ms重发
				if (current_time - g_state_timer >= 300) {
					if (g_retry_count < 3) {
						send_cmd_save_config();
						g_retry_count++;
						g_state_timer = current_time;
					} else {
						// 三次发送失败
						g_retry_count = 0;
						g_init_error = 0xFF;
						g_sys_state = SYS_STATE_INIT_COMPLETE;
						g_state_timer = current_time;
					}
				}
				break;

		// ============================================================
		// 初始化完成
		// ============================================================
		case SYS_STATE_INIT_COMPLETE:
				if (current_time - g_state_timer > 300) {
					// 进入工作界面
					g_sys_state = SYS_STATE_WORK_IDLE;
					g_state_timer = current_time;
					
					// 显示主界面
					OLED_ShowMainInterface();
					
					// 如果有错误,显示 "ERR!"
					if (g_init_error != 0) {
						OLED_ClearArea(90, 0, 38, 12);
						OLED_ShowString(92, 0, (u8*)"ERR!", 12, 1);
						OLED_Refresh();
					}
					
					OLED_Refresh();
				}
				break;

		// ============================================================
		// 工作界面
		// ============================================================
		case SYS_STATE_WORK_IDLE:
			// 工作界面逻辑...
			break;

		default:
			break;
	}
}


每个状态都按以下格式:

case SYS_STATE_XXX:
    // 1. 收到回复处理
    if (get_event(EVT_XXX, &context)) {
        // 处理数据
        g_retry_count = 0;
        g_sys_state = SYS_STATE_NEXT;
        g_state_timer = current_time;
        break;
    }

    // 2. 300ms重发逻辑
    if (current_time - g_state_timer >= 300) {
        if (g_retry_count < 3) {
            // 发送命令
            send_cmd_xxx();
            g_retry_count++;
            g_state_timer = current_time;
        } else {
            // 三次发送失败
            g_retry_count = 0;
            g_init_error = 0xFF;
            g_sys_state = SYS_STATE_NEXT;
            g_state_timer = current_time;
        }
    }
    break;

日志:

[2026-07-23 11:08:16.940]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 

[2026-07-23 11:08:17.244]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 

[2026-07-23 11:08:17.532]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 

[2026-07-23 11:08:18.140]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 

[2026-07-23 11:08:18.442]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 

[2026-07-23 11:08:18.747]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 

[2026-07-23 11:08:19.339]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 53 

[2026-07-23 11:08:19.643]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 53 

[2026-07-23 11:08:19.947]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 53 

[2026-07-23 11:08:20.553]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 37 

[2026-07-23 11:08:20.857]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 37 

[2026-07-23 11:08:21.144]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 37 

[2026-07-23 11:08:21.753]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4D 

[2026-07-23 11:08:22.056]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4D 

[2026-07-23 11:08:22.359]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4D 

[2026-07-23 11:08:22.961]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F 

[2026-07-23 11:08:23.249]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F 

[2026-07-23 11:08:23.553]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F 

[2026-07-23 11:08:24.157]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 

[2026-07-23 11:08:24.457]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 

[2026-07-23 11:08:24.766]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 

[2026-07-23 11:08:25.358]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D 

[2026-07-23 11:08:25.662]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D 

[2026-07-23 11:08:25.966]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D 

[2026-07-23 11:08:26.572]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 

[2026-07-23 11:08:26.859]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 

[2026-07-23 11:08:27.163]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 3F 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 

[2026-07-23 11:08:27.766]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F DD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2 

[2026-07-23 11:08:28.064]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F DD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2 

[2026-07-23 11:08:28.365]# RECV HEX/36 <<<
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0A 0F DD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2 
相关推荐
梅梅9663 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
Ai-_Man3 天前
您您这可以把Mistral AI的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。
人工智能·ai·小程序·电脑
kakakahahahaha3 天前
Windows C盘空间不足的安全清理与迁移流程
windows·电脑·笔记本电脑·软件需求·c盘清理
可爱系程序猿3 天前
Windows 11 下佳能 LBP2900 驱动报错溯源:安装包架构、端口绑定与队列记录
程序人生·电脑
开开心心就好3 天前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
bj_bluewei_tech4 天前
拯救者玩游戏中途突然掉电关机,小心主板短路
电脑·笔记本电脑
bitbrowser4 天前
Cloudflare验证后又弹回来,怎么判断卡在哪一步
电脑·icloud
ToDesk_Daas4 天前
随时随地手搓app!手机远程 Vibe Coding 实操分享
智能手机·电脑·iphone
凯程序猿1号4 天前
ChatCut online 剪前端性能排查录屏:瀑布图、长任务与修复复测怎样对齐
程序人生·电脑
乌萨达4 天前
低配电脑玩手游怎么设置?4GB、8GB内存与模拟器选择指南
游戏·电脑·安卓模拟器·雷电模拟器