﻿ASM 喷码机 耗材芯片读取器 —— 使用说明（含 Win7 说明）
==========================================================

【这台机器是 Windows 7？按下面顺序试】

  第 1 选择：双击  ReadChip.cmd          （PowerShell 版，已按 PowerShell 2.0 兼容改写）
  第 2 选择：双击  ReadChip_CSharp.cmd   （C# 版，只要有 .NET Framework 就能跑）

  两个版本做的事完全一样：只发读卡命令、抓取芯片回传的编码、存到桌面。
  哪个能跑通就用哪个。

  为什么要准备两个？
    · Windows 7 自带的是 PowerShell 2.0，而老版本 PowerShell 不支持一些新语法，
      所以 PowerShell 版已专门改写为 2.0 兼容（不再用 [pscustomobject]、-File 等新特性）。
    · 万一这台机器用组策略禁用了 PowerShell，PowerShell 版就跑不起来，
      这时用 C# 版 —— 它调用系统自带的 .NET 编译器现场编译一个小程序再运行，
      不依赖 PowerShell。

【功能都一样】

  1. 退出喷码机主程序（MainForm.exe），否则串口被独占。
  2. 双击启动器。
  3. 阶段1（3 秒）：只收不发，抓"感应即上报"的读头。
  4. 阶段2（25 秒）：轮流发送 10 条候选命令（地址 '0'~'4' × 命令码 0x3C/0x3D），
     每条命令单独等 400ms 收应答，并记录"哪条命令读回什么"。
     此时把芯片贴到读头上，多贴几次。
  5. 结束后桌面生成 ChipRead_日期时间_毫秒 文件夹，整个拷走。

【可选参数（做对比实验时很有用，默认 监听3秒 + 轮询25秒）】

  ReadChip_CSharp.cmd  --listen 2 --poll 10      约 12 秒跑完一轮，适合反复对比
  ReadChip.cmd         -ListenSeconds 2 -Seconds 10
  --selftest / -SelfTest                         不开串口，只验证程序自身逻辑
  --simulate / -Simulate                         不开串口，用内置虚拟读头跑完整流程
                                                 （没有硬件也能验证解析/配对/提取是否正常）

【模拟模式是什么】

  脚本内置了 3 个"虚拟读头"，内容是 2026-09-24 从真机上采到的真实帧：
    SIM-A  地址0，并把应答刻意拆成 8+14 两段发送（模拟真实的分包到达）
    SIM-B  地址1
    SIM-C  地址2，编码区填入真实卡号 04 24 0D 1C（模拟"位上有芯片"的样子）
  跑一次就能确认：帧解析、地址匹配、分包处理、编码提取、结果落盘是否都正常。

【结果文件夹里有什么】

  results.txt                  解析出的帧 + 命令/应答配对表
  session.log                  本次运行的完整日志
  raw\COMx_raw.hex             收到的全部原始字节（没解析出帧时最有用）
  raw\COMx_trace.txt           收发时序（哪条命令发出的、收到什么）
  raw\COMx_pair.txt            命令 → 应答 配对表（判断"哪条命令读回什么"）

【技术参数（逆向自 RFReader.exe / VSNScd.dll）】

  串口     : 9600 bps, 8 数据位, 无校验, 1 停止位
  墨水路cmd: 01 08 A3 30 3C 01 00 58
  溶剂路cmd: 01 08 A3 31 3D 01 00 58
  校验算法 : 末字节 = ~(前面所有字节异或) & 0xFF
  芯片应答 : 22 字节  01 16 A3 ?? ?? [16字节编码] CS

【本工具只读】

  只发送两条"读卡"命令及其通道变体，不发送任何写卡 / 改写 / 擦除命令。
--------------------------------------------------------------------------------
配合虚拟读头 ChipSim 做本机验证（不接任何真实读头）
--------------------------------------------------------------------------------
1. 装好虚拟串口软件，建两对端口，例如：
     COM2 <-> COM12      COM3 <-> COM13
   （用 com0com 的命令行：setupc install PortName=COM2 PortName=COM12 EmuBR=yes）
2. 先启动假读头：   ChipSim\ChipSim.cmd          默认监听 COM12、COM13
3. 再跑本脚本，只测"软件侧"那两个口：
     ReadChip.cmd -OnlyPort COM2,COM3 -ListenSeconds 1 -Seconds 12
4. 预期结果：
     * COM2 上收到 地址0/命令3C 的应答，状态 100
     * COM3 上收到 地址1/命令3D 的应答，状态 100
     * results.txt 的配对表里，每一条匹配命令都有应答，其余显示"(无应答)"
   若 ChipSim 用 -Profile chip，编码区应出现 64 04 24 0D 1C ...
5. 全程不碰任何真实设备，可反复做；不满意直接重跑。

本版新增参数
  -OnlyPort COM2,COM3       只测指定串口（配合虚拟读头做定向验证）
--------------------------------------------------------------------------------
报错：发送失败 … 写入超时（= 对端没有在读数据）
--------------------------------------------------------------------------------
现象：控制台每秒刷一条
   发送失败：使用"3"个参数调用"Write"时发生异常:"写入超时。"

原因（com0com 虚拟串口，本机实测）：
  * 对端端口「完全没打开」   -> 第 1 次写入成功，第 2 次就超时，之后一直超时
  * 对端打开但「没有读数据」 -> 能写 512 次（正好 4096 字节）后才开始超时
所以「持续每秒超时」= 假读头没有在监听那个口。

处置顺序：
  1) 先起假读头，并让那个窗口一直开着：ChipSim\ChipSim.cmd
     它默认 -Seconds 30，到点会自己退出；要长时间实验用 -Seconds 0
  2) 确认配对关系：双击 ChipSim\CheckPairs.cmd
     （或进 com0com 安装目录运行 setupc list）
     应为： CNCA0 PortName=COM2 <-> CNCB0 PortName=COM12
            CNCA1 PortName=COM3 <-> CNCB1 PortName=COM13
     假读头监听 COM12/COM13，本脚本测 COM2/COM3
  3) 如果建的是别的端口号，两边参数都要跟着改

本版改进（v6）：检测到连续 3 次写入超时会直接打印上面的检查清单并提前结束该
串口，不再刷屏；同时每次写失败会清一次输出缓冲，便于恢复。
