Files
Leakage-Control/leakage_system/usr/app/app_com.c
chenzongxiong 7373c0ad95 update:
设备屏蔽功能
适配新版界面
2026-03-06 13:48:42 +08:00

146 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_com.h"
#include "app_leakage.h"
#include "bsp_w25q.h"
#include <string.h>
#include "proto_modbus_master_leakage.h"
/*com口对应的串口*/
bsp_uart_t *com_to_uart[APP_COM_NUM] =
{
&com_uart4,
&com_uart2,
&com_uart3,
&com_uart6,
};
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum);
static void app_com_class_update(void );
static void app_com_init(void);
static void app_com_save_baudrate_to_flash(void);
static void app_com_load_baudrate_from_flash(void);
app_com_t app_com=
{
.init = app_com_init,
.class_update = app_com_class_update,
.save_flah = app_com_save_baudrate_to_flash,
};
static void app_com_init(void)
{
u8 i;
for(i=0;i<APP_COM_NUM;i++)
{
app_com.com[i].com_uart = com_to_uart[i];
app_com.com[i].set.baud_rate = app_com_class_baud_rate_set;
app_com.com[i].flash_data.baudrate = 4;
}
app_com_class_update();
app_com_load_baudrate_from_flash();
}
/* 波特率枚举值到实际数值的转换并设置串口 */
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum)
{
u32 baud_value;
switch (baud_enum) {
case 0: baud_value = 4800; break;
case 1: baud_value = 9600; break;
case 2: baud_value = 19200; break;
case 3: baud_value = 57600; break;
case 4: baud_value = 115200; break;
default: baud_value = 115200; break;
}
if (p_com->com_uart && p_com->com_uart->set.baud_rate) {
p_com->com_uart->set.baud_rate(p_com->com_uart, baud_value);
}
}
/* 从Flash加载波特率到内存并应用 */
static void app_com_load_baudrate_from_flash(void)
{
u8 baud_vals[APP_COM_NUM];
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, baud_vals, APP_COM_NUM);
for (u8 i = 0; i < APP_COM_NUM; i++) {
if (baud_vals[i] == 0xFF) { // 未初始化设为默认115200
app_com.com[i].flash_data.baudrate = 4;
} else {
app_com.com[i].flash_data.baudrate = baud_vals[i];
}
// 应用波特率到串口硬件
app_com_class_baud_rate_set(&app_com.com[i], app_com.com[i].flash_data.baudrate);
}
}
/* 将当前波特率保存到Flash */
static void app_com_save_baudrate_to_flash(void)
{
u8 current_vals[APP_COM_NUM];
u8 flash_vals[APP_COM_NUM];
/*当前内存中的波特率枚举值*/
for (u8 i = 0; i < APP_COM_NUM; i++) {
current_vals[i] = app_com.com[i].flash_data.baudrate;
}
/*从 Flash 读取已存储的值*/
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, flash_vals, APP_COM_NUM);
// 比较是否完全相同
if (memcmp(current_vals, flash_vals, APP_COM_NUM) == 0) {
// 没有变化,无需写入
return;
}
// 擦除包含该地址的扇区4K对齐
uint32_t erase_addr = W25Q32_COM_BAUDRATE_ADDR & ~(W25Q32_SECTOR_SIZE - 1);
w25q32_sector_erase(erase_addr);
w25q32.write(W25Q32_COM_BAUDRATE_ADDR, current_vals, APP_COM_NUM);
}
/*将同一com口的设备进行划分*/
static void app_com_class_update(void )
{
u16 i,j;
u8 com_index,id;
/********************************************总数清零******************************************************/
for(i=0;i<APP_COM_NUM;i++)
{
modbus_leakage[i].sensor_num = 0;
}
/*遍历子系统*/
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
{
/*设备使能*/
if(ENABLE == leakage.sub_device_data[i].flash_data.state)
{
/********************************************COM口划分******************************************************/
com_index = leakage.sub_device_data[i].flash_data.com;
id = leakage.sub_device_data[i].flash_data.modbus_id;
proto_sensor_class_t *p_sensor = &modbus_leakage[com_index].sensor[modbus_leakage[com_index].sensor_num];
/* ★ 清空整个传感器结构体 */
memset(p_sensor, 0, sizeof(proto_sensor_class_t));
/*绑定modbus id*/
p_sensor->comm.id = id;
/*绑定子设备索引索引*/
p_sensor->comm.leakage_data_index = i;
/* ★ 设置初始状态为默认(发送请求) */
p_sensor->comm.state = PROTO_LEAKAGE_COMM_STATE_DEFAULT;
/*comm口设备总数++*/
modbus_leakage[com_index].sensor_num++;
}
}
}