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 
相关推荐
JoyCong19987 小时前
手机变身“司令台”!ToDesk AI安卓版上线
网络·人工智能·科技·智能手机·电脑·远程工作·远程操作
a4493153627 小时前
iPhone 基带故障诊断——无服务/搜索不到网络的芯片级维修实录
网络·macos·ios·电脑·iphone
a4493153628 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
2601_962364979 小时前
Windows Hello 完整科普:解锁设备安全新方案
电脑
a44931536210 小时前
iPhone 充电故障的全链路诊断——从 Lightning/USB-C 接口到 Tristar 充电 IC
c语言·macos·ios·电脑·硬件架构·iphone
a180903242511 小时前
笔记本电脑wifi图标变灰解决方法
电脑
qq_369224331 天前
软件启动提示kernelbase.dll丢失,电脑弹出找不到kernelbase.dll高效修复办法
电脑·dll·dll修复·dll丢失·dll错误
humors2211 天前
新手笔记本/路由/手机安全问题小记
安全·华为·电脑·手机·路由器·笔记本·tplink
驱动小百科1 天前
小米手机usb驱动程序下载 轻松连接电脑传输文件
智能手机·电脑·小米手机usb驱动·小米usb驱动下载·小米手机驱动安装·手机usb驱动程序