开机主流程:
【开机初始化自检流程】
- 用户长按电源键开机
↓
- 显示品牌Logo (约0.5秒)
↓
- 显示"自检中..." + 动态进度条
↓
- 步骤1: 读取工作状态 (0x0F 0x11)
-
成功: 继续
-
超时(1秒): 记录错误码1,继续
↓
- 步骤2: 读取工作模式 (0x03)
-
成功且匹配: 继续
-
成功但不匹配: 进入步骤3
-
超时(1秒): 记录错误码2,继续
↓
- 步骤3: 写入工作模式 (0xC3) 仅当不匹配时
-
成功: 继续
-
超时(0.5秒): 记录错误码3,继续
↓
- 步骤4: 读取音量 (0x0F 0x5C)
-
成功: 保存音量值,继续
-
超时(1秒): 记录错误码4,继续
↓
- 步骤5: 读取电量 (0x0F 0x38)
-
成功: 保存电量值,继续
-
超时(1秒): 记录错误码5,继续
↓
- 步骤6: 读取MIC增益 (0x0F 0x42)
-
成功: 保存MIC值,继续
-
超时(1秒): 记录错误码6,继续
↓
- 步骤7-14: 检查4个信道 (循环)
每个信道:
-
读取参数 (0x3F)
-
匹配默认值 → 跳过
-
不匹配 → 写入默认值 (0xCF)
-
超时: 记录对应错误码,继续
↓
- 步骤15: 保存配置 (0x0F 0xDD)
-
成功: 继续
-
超时(0.5秒): 记录错误码15,继续
↓
- 自检完成,进入主界面
↓
- 显示结果:
-
无错误: 正常显示
-
有错误: 显示 "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