You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.1 KiB

ReadCard 程序流程文档

启动流程

main()
  │
  ├─ OpenPort(port, baudrate)          打开串口
  ├─ SetDevice(device)                 设置设备名
  ├─ StorePasswd(password)             存储扇区密码表
  │
  ├─ InitSequence()                    初始化序列(同步阻塞)
  │   ├─ StopCard()                    → 等待应答 (3s超时)
  │   ├─ SetPasswd(1)                  → 等待应答
  │   ├─ SetPasswd(2)                  → 等待应答
  │   ├─ SetPasswd(3)                  → 等待应答
  │   ├─ SetPasswd(4)                  → 等待应答
  │   ├─ SetPasswd(5)                  → 等待应答
  │   ├─ SetPasswd(10)                 → 等待应答
  │   └─ FindCard()                    发出首次寻卡, AutoFind=true
  │      (任一步失败 → 程序退出)
  │
  ├─ 启动 sub_thread                   DDS命令接收线程
  └─ 启动 pub_thread                   设备响应发布线程

运行时两个线程

sub_thread (DDS命令接收)                pub_thread (设备响应发布, 100ms周期)
  │                                      │
  │  收到 ReadCardReq                    │  HandleDeviceMsg()
  │  → HandleDdsMsg()                    │  → RecvDeviceMsg() 读串口
  │                                      │  → ParseDeviceMsg() 解析响应
  │                                      │  → 有数据则 writer_->write() 发布DDS
  │                                      │
  │                                      │  AutoFindTick()
  │                                      │  → AutoFind开启时按间隔发FindCard

DDS 对外接口

订阅 Topic: ReadCardReq

命令 参数 行为
"find" 清空重复卡记录,启动自动寻卡
"read" {扇区号} 暂停自动寻卡,读指定扇区
"write" {扇区号, 数据...} 暂停自动寻卡,写指定扇区
"stop" 停止自动寻卡
"beep" {时长} 或空 暂停自动寻卡,蜂鸣(默认0x0F)
"reset" 暂停自动寻卡,清空串口缓冲区

发布 Topic: ReadCardRsp

响应 内容 说明
"find" 成功:{卡号4字节} 失败:{错误码} 寻卡结果
"read" 成功:{数据17字节} 失败:{错误码} 读卡结果
"write" {状态码} 写卡结果
"stop" {状态码} 停止结果
"beep" {状态码} 蜂鸣结果

自动寻卡状态机

                    ┌──────────────────────────┐
                    │     AutoFind = true       │
                    │   (自动寻卡运行中)         │
                    │                          │
                    │  AutoFindTick按间隔       │
                    │  发送FindCard             │
                    └──┬────────┬───────────┬──┘
                       │        │           │
              寻卡失败  │  寻卡成功(新卡)│    寻卡成功(重复卡)
           interval=500ms│  AutoFind=false│    interval=5000ms
              继续重试   │  发布卡号      │    不发布,继续寻卡
                       │        │           │
                       │        ▼           │
                       │   ┌────────────┐   │
                       │   │AutoFind=false│   │
                       │   │(等待业务处理)│   │
                       │   └──┬─────┬───┘   │
                       │      │     │       │
                       │  DDS下发   DDS下发   │
                       │  read     write    │
                       │      │     │       │
                       │      ▼     ▼       │
                       │   设备响应返回       │
                       │   AutoFind=true     │
                       │   interval=500ms    │
                       │      │              │
                       └──────┘──────────────┘
                    (回到自动寻卡状态)

  特殊命令:
    "stop"  → AutoFind=false, 完全停止寻卡
    "find"  → AutoFind=true, 清空PreCard, 重新开始寻卡
    "beep"/"reset" → AutoFind=false, 暂停寻卡(需DDS重发find恢复)

定时间隔策略

时机 间隔 说明
发送FindCard后 5000ms 超时保护,无应答则重发
寻卡失败 500ms 快速重试
重复刷卡 5000ms 同一张卡不重复处理
读写完成恢复 500ms 业务结束后快速恢复寻卡

启动参数

参数 默认值 说明
--domain 0 DDS域ID
--interface serial 接口类型
--port ttyS1 串口端口
--baudrate 9600 波特率
--device RC522 设备名称
--version - 显示版本号
--help - 显示帮助信息