diff --git a/apps/chrg/applications/thread/chrg_roll_sou.c b/apps/chrg/applications/thread/chrg_roll_sou.c index a141d7a..34e6542 100644 --- a/apps/chrg/applications/thread/chrg_roll_sou.c +++ b/apps/chrg/applications/thread/chrg_roll_sou.c @@ -22,6 +22,7 @@ #include #define SOU_MUTEX_TIMEOUT_MS 100 +#define SOU_RESPONSE_TIMEOUT_MS 20 #define SOU_COM_MAX_ATTEMPTS 3 chrg_rollsou_com_t g_sou_com_batch = {0}; @@ -77,6 +78,23 @@ int chrg_sou_com_batch_submit(eIDX_SOU_CH ch, const rt_uint16_t *regs, pBatch->cur_idx = 0; } + /* + * 电流调节采用最新值有效策略。若同一通道仍有尚未发送的电流命令, + * 直接覆盖旧值,避免四通道快速测试时队列积累过时的电流设置。 + * 当前命令已经发送时不覆盖,保证响应仍与原命令匹配。 + */ + if ((count == 1) && (regs[0] == (REG_CURRENT_OUT + 1))) { + for (i = pBatch->cur_idx; i < pBatch->reg_cnt; i++) { + if (pBatch->reg_list[i] == regs[0]) { + pBatch->val_list[i] = vals[0]; + pBatch->pending = RT_TRUE; + pROLL->run = RUN_COM; + rt_mutex_release(pTHR->mutex); + return 0; + } + } + } + if ((pBatch->reg_cnt > SOU_COM_BATCH_REG_MAX) || (count > (SOU_COM_BATCH_REG_MAX - pBatch->reg_cnt))) { LOG_E("sou com batch reg full: ch=%d queued=%d append=%d max=%d", @@ -391,7 +409,8 @@ void chrg_roll_sou_thread_entry (void *data) } pMB_R = RT_NULL; - ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, 50); + ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, + rt_tick_from_millisecond(SOU_RESPONSE_TIMEOUT_MS)); if ((RT_EOK == ret) && (RT_NULL != pMB_R)) { rt_bool_t response_valid; @@ -424,7 +443,6 @@ void chrg_roll_sou_thread_entry (void *data) } sou_msg_free(&pMB_R); - rt_thread_mdelay(20); } else { sou_msg_free(&pMB_R); if ((run == RUN_COM) && command_valid) {