完善A卡读取不稳问题
This commit is contained in:
@@ -308,7 +308,32 @@ namespace WinISP
|
||||
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(用于完整性判断)
|
||||
// 然后截断到 reportedDataLen,排除末尾DDC校验和字节
|
||||
|
||||
Reference in New Issue
Block a user