完善A卡读取不稳问题

This commit is contained in:
chenjiangqun
2026-07-02 10:58:46 +08:00
parent 65a3117d10
commit 40dce42fd7

View File

@@ -308,7 +308,32 @@ namespace WinISP
continue; continue;
} }
int reportedDataLen = recv[1] & 0x7F; // DDC响应头中声明的数据长度 // ── DDC XOR 校验和验证 ──────────────────────────────
// DDC/CI 协议: XOR(recv[0]..recv[checksumPos]) 必须 = 0x00。
// AMD ADL 偶尔返回损坏的响应头reportedDataLen 被放大),
// 导致 recv[1] 和后续字节与实际数据不匹配,校验和必定失败。
// 校验成功 = 数据完整可信;校验失败 = 丢弃此轮读取。
int reportedDataLen = recv[1] & 0x7F;
int checksumPos = 2 + reportedDataLen;
bool checksumOk = false;
if (recv.Length > checksumPos)
{
byte xor = 0;
for (int i = 0; i <= checksumPos; i++)
xor ^= recv[i];
checksumOk = (xor == 0);
}
// 如果 recv 太短不包含校验和(如 N卡截断仍继续使用数据
if (!checksumOk && recv.Length > checksumPos)
{
frmISP.WriteLog(
$"[DDC] cmd=0x{subCmd:X2} checksum FAIL, reportedDataLen={reportedDataLen}, " +
$"recvLen={recv.Length} — corrupted response discarded",
"debug");
WinIOLib.DelayMs(20);
continue;
}
// ── End 校验和验证 ──────────────────────────────────
// 先按原始方式扫描整个buffer找\0用于完整性判断 // 先按原始方式扫描整个buffer找\0用于完整性判断
// 然后截断到 reportedDataLen排除末尾DDC校验和字节 // 然后截断到 reportedDataLen排除末尾DDC校验和字节