feat(can): 添加节点ID设置命令的安全防护和改进闪存写入逻辑
- 添加目标节点验证机制,防止SET_NODE_ID命令被错误处理 - 修改节点ID范围验证逻辑,限制为1到0xFF - 调整闪存写入顺序,在确认写入成功后再发送响应 - 修复SET_NODE_ID消息处理中的边界条件检查 fix(can): 启用自动总线离线恢复功能 - 将CAN参数auto_bus_off_recovery从DISABLE改为ENABLE - 提高CAN通信的稳定性和自动恢复能力 chore(config): 更新软件版本号并添加编译时间信息 - 将软件补丁版本从24更新到25 - 添加APP_BUILD_DATE和APP_BUILD_TIME宏定义 - 新增getAppBuildTime函数获取编译时间信息 - 添加Flash页大小相关注释说明 perf(debug): 调整ST-Link调试器时钟频率 - 将调试器时钟从10MHz降低到4MHz - 提高调试连接的稳定性 refactor(static_test): 移除静态测试文件列表 - 删除static_test_automotive_business_20260523/files.csv文件内容
This commit is contained in:
+14
-9
@@ -418,7 +418,7 @@ void canfd_config(void) {
|
||||
|
||||
/* initialize CAN */
|
||||
can_parameter.time_triggered = DISABLE;
|
||||
can_parameter.auto_bus_off_recovery = DISABLE;
|
||||
can_parameter.auto_bus_off_recovery = ENABLE;
|
||||
can_parameter.auto_wake_up = DISABLE;
|
||||
can_parameter.auto_retrans = ENABLE;
|
||||
can_parameter.rec_fifo_overwrite = ENABLE;
|
||||
@@ -1155,6 +1155,12 @@ void CAN_transmiter::handle_boot_message(u16 sender_node_id) {
|
||||
}
|
||||
|
||||
void CAN_transmiter::handle_set_node_id_message(can_receive_message_struct ¤t_message) {
|
||||
// ── 防护:只处理发给本节点(或广播)的 SET_NODE_ID ──
|
||||
u16 target_node = (u16)((current_message.rx_efid >> 16) & 0xFFFF);
|
||||
if (target_node != node_id && target_node != BROADCAST_NODE_ID) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 支持 1 字节和 2 字节节点 ID 命令,兼容旧上位机。
|
||||
CAN_DEBUG_PRINT(
|
||||
"SET_NODE_ID: rx_dlen=%d, data[0]=%02X data[1]=%02X\r\n",
|
||||
@@ -1173,23 +1179,22 @@ void CAN_transmiter::handle_set_node_id_message(can_receive_message_struct &curr
|
||||
// 响应帧使用旧节点 ID 构造,确保上位机能收到确认。
|
||||
node_id = old_node_id;
|
||||
|
||||
if (new_node_id > MAX_NODE_ID || new_node_id == BROADCAST_NODE_ID) {
|
||||
CAN_DEBUG_PRINT("SET_NODE_ID: invalid new_id=%d (max=%d)\r\n",
|
||||
new_node_id, MAX_NODE_ID);
|
||||
if (new_node_id < 1 || new_node_id > SETTABLE_NODE_ID_MAX) {
|
||||
CAN_DEBUG_PRINT("SET_NODE_ID: invalid new_id=%d (range 1~%d)\r\n",
|
||||
new_node_id, SETTABLE_NODE_ID_MAX);
|
||||
transmit_data[0] = 0x00;
|
||||
CANFD_AsyncSend(build_can_id(CANFD_SET_NODE_ID), 3, transmit_data);
|
||||
return;
|
||||
}
|
||||
|
||||
transmit_data[0] = 0x01;
|
||||
u8 send_result = CANFD_AsyncSend(build_can_id(CANFD_SET_NODE_ID), 3,
|
||||
transmit_data);
|
||||
// 先写 Flash,成功后再回确认,避免 Flash 失败时上位机已收到 OK。
|
||||
u8 save_status = save_node_id_to_flash(new_node_id);
|
||||
|
||||
CAN_DEBUG_PRINT("SET_NODE_ID: save_status=%d, send_result=%d\r\n",
|
||||
save_status, send_result);
|
||||
CAN_DEBUG_PRINT("SET_NODE_ID: save_status=%d\r\n", save_status);
|
||||
|
||||
if (save_status == FLASH_EEPROM_OK) {
|
||||
transmit_data[0] = 0x01;
|
||||
CANFD_AsyncSend(build_can_id(CANFD_SET_NODE_ID), 3, transmit_data);
|
||||
CAN_DEBUG_PRINT("SET_NODE_ID: SUCCESS, node_id updated from %d to %d\r\n",
|
||||
old_node_id, new_node_id);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user