CustomProtocolLengthTests.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using IvfTl.Control.Entity;
  2. using ivf_tl_SerialHelper.Util;
  3. using Xunit;
  4. namespace ivf_tl_SerialHelper.Tests
  5. {
  6. /// <summary>
  7. /// M-05 合并回归:control 端 Commander.CustomProtocolLength(决定每条指令【回包帧长】)与
  8. /// 合并前 operate 黄金真值(临时文件/ivf_tl_operate_2.0/ivf_tl_Entity/ComEntitys/Commander.cs)分歧——
  9. /// · 0x12 写E方:operate=12,control=6 ← 真机实证回包确为 12(回包[3]=0x0C 自证,舱8/舱9 一致)
  10. /// · 0x10 获取IO/读门:operate=7,control 缺→默认6 ← 真机实证读门回包确为 7([3]=0x07,舱8/舱9 一致)
  11. /// · 0x08 读传感器AD:operate=9,control 缺→默认6 ← operate基线+autofocustool 一致;control 不发该命令(死路径,对齐基线)
  12. /// control 帧长过短 → 只读前 N 字节、把数据字节误当状态字(非0→误判失败)、ORC 错位,
  13. /// 并残留尾字节污染紧接的下一次读(=M-01/02/03 验证时"写后读垃圾值"现象的根因)。
  14. /// 帧长表是纯逻辑,这里 red→green;消除帧错位的真机回环走 EEPROM 读写验证。
  15. /// </summary>
  16. public class CustomProtocolLengthTests
  17. {
  18. // 构造一条以 cmd 为命令码[1]的最小帧,跑 CustomProtocolLength,返回判定出的回包帧长。
  19. private static int LenOf(byte cmd)
  20. {
  21. var custom = new CustomProtocol { sendBuffer = new byte[] { 0x5E, cmd, 0x00, 0x06, 0x00, 0x00 } };
  22. Commander.CustomProtocolLength(custom);
  23. return custom.lenght;
  24. }
  25. /// <summary>0x12 写E方回包帧长必须=12(真机实证:舱8/舱9 写排气阀回包均 12 字节,回包[3]=0x0C 自证)。</summary>
  26. [Fact]
  27. public void 写E方0x12_回包帧长应为12_真机实证()
  28. {
  29. Assert.Equal(12, LenOf(0x12));
  30. }
  31. /// <summary>0x10 获取IO/读门回包帧长必须=7(真机实证:舱8/舱9 读门回包均 7 字节,回包[3]=0x07 自证)。</summary>
  32. [Fact]
  33. public void 获取IO0x10_回包帧长应为7_真机实证()
  34. {
  35. Assert.Equal(7, LenOf(0x10));
  36. }
  37. /// <summary>0x08 读传感器AD回包帧长必须=9(operate基线+autofocustool 一致)。</summary>
  38. [Fact]
  39. public void 读传感器AD0x08_回包帧长应为9_对齐基线()
  40. {
  41. Assert.Equal(9, LenOf(0x08));
  42. }
  43. /// <summary>
  44. /// 整张帧长表必须与合并前 operate 黄金真值逐项一致(回归护栏)。
  45. /// 期望值 = operate ivf_tl_Entity/ComEntitys/Commander.cs CustomProtocolLength(真机已用)。
  46. /// </summary>
  47. [Theory]
  48. [InlineData(0x01, 6)] // 握手
  49. [InlineData(0x02, 6)] // 自检
  50. [InlineData(0x04, 7)] // 设目标温度
  51. [InlineData(0x05, 6)] // 电机控制
  52. [InlineData(0x06, 9)] // 读传感器信号
  53. [InlineData(0x08, 9)] // 读传感器AD ← control 原缺
  54. [InlineData(0x09, 6)] // 设IO
  55. [InlineData(0x10, 7)] // 获取IO/读门 ← control 原缺
  56. [InlineData(0x11, 10)] // 读E方
  57. [InlineData(0x12, 12)] // 写E方 ← control 原为 6
  58. [InlineData(0x16, 6)] // 自动换气 ← control 原缺(值与默认同)
  59. [InlineData(0x18, 10)] // 读电机位置
  60. [InlineData(0x19, 6)] // 缓冲瓶补气
  61. [InlineData(0x20, 12)] // 读缓冲瓶数据
  62. public void 帧长表逐项对齐operate基线(byte cmd, int expectedLen)
  63. {
  64. Assert.Equal(expectedLen, LenOf(cmd));
  65. }
  66. /// <summary>未知命令码回退默认 6(与基线一致)。</summary>
  67. [Fact]
  68. public void 未知命令码_回退默认6()
  69. {
  70. Assert.Equal(6, LenOf(0x7F));
  71. }
  72. }
  73. }