FrameLengthHilTests.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System.Threading;
  2. using IvfTl.Hardware.HilTests.Infrastructure;
  3. using IvfTl.Hardware.Impl;
  4. using Xunit;
  5. using Xunit.Abstractions;
  6. namespace IvfTl.Hardware.HilTests
  7. {
  8. /// <summary>
  9. /// M-05 防回归:0x12 写 E方回包帧长修复为 12 后,读路径不被残留字节污染。
  10. /// 帧长若回退为 6,写后残留字节会错位污染紧接的读 → 出现 -1/垃圾值。
  11. /// 纯读变体:连续多轮读排气阀时间,断言全部 sane 非负。纯 0x11 读,无电机,非破坏。
  12. /// (帧长表本身另由 ivf_tl_SerialHelper.Tests/CustomProtocolLengthTests 单测逐项锁死。)
  13. /// </summary>
  14. [Collection("HIL")]
  15. public class FrameLengthHilTests
  16. {
  17. private readonly HardwareRigFixture _rig;
  18. private readonly ITestOutputHelper _out;
  19. public FrameLengthHilTests(HardwareRigFixture rig, ITestOutputHelper o) { _rig = rig; _out = o; }
  20. [SkippableFact]
  21. public void RepeatedReads_AreClean_NoFrameCorruption()
  22. {
  23. var chamber = _rig.FirstChamberWithWells();
  24. Skip.If(chamber == null, "无响应真舱:无硬件 / control 正占用串口 / 未连接");
  25. const int rounds = 12;
  26. int clean = 0;
  27. SerialChannelImpl ch = null;
  28. try
  29. {
  30. ch = new SerialChannelImpl(0, chamber.Port);
  31. Assert.True(ch.Open(), $"{chamber.Port} 打开失败");
  32. for (int r = 0; r < rounds; r++)
  33. {
  34. int v = ch.ReadOpenVentTimeWait();
  35. if (v >= 0) clean++;
  36. else _out.WriteLine($"轮{r} 读={v}(脏/无响应)");
  37. Thread.Sleep(80);
  38. }
  39. }
  40. finally { try { ch?.Close(); } catch { } }
  41. _out.WriteLine($"舱{chamber.HouseSn} 连续读 {rounds} 轮,干净 {clean}/{rounds}");
  42. Assert.Equal(rounds, clean); // 帧长正确则每轮都 sane;有错位则出现 -1
  43. }
  44. }
  45. }