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.
122 lines
5.1 KiB
Markdown
122 lines
5.1 KiB
Markdown
# 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` | - | 显示帮助信息 |
|