完善A卡读取不稳问题
This commit is contained in:
@@ -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校验和字节
|
||||||
|
|||||||
Reference in New Issue
Block a user