﻿虚拟读头 ChipSim —— 现场速查
================================================================

它是什么
  一个"假读头"。在没有真实读头/芯片的情况下，替它们应答，
  让喷码机软件能正常识别、加载耗材。

  应答内容不是编的：是 2026-09-24 从真机采集到的 22 字节原始
  应答帧，逐字节还原。

不用它做什么
  * 不写卡、不改卡、不改任何配置文件
  * 不写注册表、不联网
  * 只做"应答"这一件事

--------------------------------------------------------------------------------
前置条件：一对虚拟串口
--------------------------------------------------------------------------------
软件通过固定的串口号去开读头。要让它看到"读头"，需要一个虚拟串口对，
一端给软件、一端给 ChipSim。常见做法（任选其一）：

  A. 装 com0com（免费开源虚拟串口驱动）
     建两对：COM2 <-> COM12，COM3 <-> COM13
     然后：软件「串口设置」填 COM2 / COM3，ChipSim 监听 COM12 / COM13

  B. 若你的软件「串口设置」允许改成 COM12/COM13 这类高位号，
     也可以只建一对，把它指到空闲号上，避免和真实设备抢名字。

  注意：真实读头如果正插着并占了 COM2/COM3，虚拟串口就建不出同样的名字，
        这时改用别的号，并把软件的「串口设置」改过去（改完必须重启软件）。

--------------------------------------------------------------------------------
怎么用
--------------------------------------------------------------------------------
1. 双击 ChipSim.cmd
2. 直接回车用默认（监听 COM12、COM13、measured 档）
3. 打开喷码机软件 →「串口设置」确认端口号 → 重启软件
4. 观察 ChipSim 窗口：会逐条打印"收到命令 … / 应答 …"

命令行参数
  -Port COM12,COM13      监听哪些串口（默认 COM12,COM13）
  -Profile <档位>         应答策略，见下表
  -Addr 0 / 1 / any       只应答该地址（默认为 all）
  -Seconds 60             跑 60 秒后自动结束（默认一直跑）
  -DelayMs 5              应答延迟毫秒
  -Status 100             强制状态字节（覆盖档位）
  -Code "04 24 0D 1C"     指定编码区 15 字节内容
  -DumpOnly               只记录、绝不应答（强烈建议先用它跑一次）
  -ListPorts              列出本机串口
  -SelfTest               自检，不开串口
  -NoWait                 结束后不等回车（自动化用）

档位说明
  auto       已知的四组按实测复刻，其余命令（软件的心跳 0x01 等）一律回 100
             ← 让喷码机软件启动/识别时用这个
  measured   复刻真实读头行为：
               地址'0' + 命令3C -> 状态 100
               地址'0' + 命令3D -> 状态 0
               地址'1' + 命令3C -> 状态 0
               地址'1' + 命令3D -> 状态 100
             其他地址组合 -> 完全不回（真实读头就是沉默的）
  chip       任何地址都回，状态 100，编码区填已知卡号 04 24 0D 1C
             （用来试"软件认不认这个卡号"）
  always100  任何地址都回，状态 100，编码区全 0
  empty      任何地址都回，状态 0
  silent     完全不应答（配合 -DumpOnly 就是纯嗅探器）

--------------------------------------------------------------------------------
最有价值的一个用法：当嗅探器
--------------------------------------------------------------------------------
  ChipSim.cmd -Port COM12 -DumpOnly
  然后打开软件，看它到底发了什么命令、发到哪个地址。
  这一层我们之前只能靠反汇编推测，现在能看到真实的。
  记录会写到 ChipSim_<时间>\sim.log，直接发回来即可。

--------------------------------------------------------------------------------
读不到的常见原因
--------------------------------------------------------------------------------
1. 虚拟串口没建好，或名字和软件「串口设置」里的不一样
2. 软件还在用旧端口号 —— 改完「串口设置」必须重启软件
3. 真实读头还占着同一个串口号（两个程序不能同时开同一个口）
4. 软件没被关掉就改设置 —— 软件开着时它已占住端口
5. 档位选错：measured 档对未知地址是沉默的，先用 always100 试

--------------------------------------------------------------------------------
协议参考（实测确认）
--------------------------------------------------------------------------------
命令帧 8 字节   01 08 A3 <地址> <命令> 01 00 <校验>
应答帧 22 字节  01 16 A3 <地址> 00 <状态> <15字节编码区> <校验>
校验 = 本帧内它前面所有字节逐字节异或后取反
串口 = 9600 / 8 数据位 / 无校验 / 1 停止位
地址 = '0'(0x30)、'1'(0x31)
命令 = 0x3C、0x3D（读状态，见上表）；0x01（软件每秒发一次的在线轮询）

--------------------------------------------------------------------------------
喷码机软件实际会发的命令（2026-09-24 用本程序抓到）
--------------------------------------------------------------------------------
  01 08 A3 30 3C 01 00 58    地址0 + 0x3C   软件开机时问一次
  01 08 A3 31 3D 01 00 58    地址1 + 0x3D   软件开机时问一次
  01 08 A3 30 01 01 00 65    地址0 + 0x01   之后每秒轮询（心跳）
  01 08 A3 31 01 01 00 64    地址1 + 0x01   之后每秒轮询（心跳）

  -Profile measured 只会回答前两条；用 -Profile auto 才会把 0x01 也答上，
  软件才能继续往下走。若还卡在后面某个命令上，把 ChipSim 窗口内容或
  sim.log 发回来，我们按同样方式补上即可。
