## 1 串口配置
目前模组支持两种通信接口:UART,USB(CDC)。其中
UART:
- 波特率:115200
- 数据位:8
- 停止位:1
- 奇偶检验:无
- 流控制:无
USB(CDC):
- 波特率:2000000
- 数据位:8
- 停止位:1
- 奇偶检验:无
- 流控制:无
## 2 消息格式
主控和模块通讯的基本格式如下表所示,字节序为 **大端字节序(Big Endian)**:
| SyncWord | MsgID | DataSize | Data | ParityCheck |
| -------- | ------ | -------- | ------- | ----------- |
| 2 bytes | 1 byte | 2 bytes | N bytes | 1 byte |
下表是对上述各个字段的详细说明:
| 字段 | 长度 | 说明 |
| ----------- | ------- | ------------------------------------------------------------ |
| SyncWord | 2 bytes | 固定的消息开头同步字:0xEF 0xAA |
| MsgID | 1 byte | 消息ID(例如 MID_VERIFY) |
| DataSize | 2 bytes | Data数据的长度,0 ≤ size ≤ 65535 |
| Data | N bytes | 消息(MsgID)对应的数据内容,长度 N 为 DataSize 。
0表示此消息无参数 |
| ParityCheck | 1 byte | 协议的奇偶检验码。
去除SyncWord,对 MsgID、DataSize、Data 的内容字节做XOR运算 |
## 3 消息列表
| MsgID | Code | 说明 |
| ----------------- | ---- | ------------------------------------------------------------ |
| MID_REPLY | 0x00 | 模组对主控发送出的命令的应答,对于主控下发的每条命令,模组最终都会使用 MID_REPLY 进行结果应答上报 |
| MID_NOTE | 0x01 | 摸组主动上报给主控的信息,根据 NID 判断消息类型和对应的 Data 结构(详细内容见下文) |
| MID_RESET | 0x10 | 主控下发,用于打断模组当前执行的任务 |
| MID_VERIFY | 0x12 | 掌静脉识别比对 |
| MID_ENROLL_SINGLE | 0x1D | 掌静脉录入 |
| MID_DELUSER | 0x20 | 删除一个已录入的掌静脉 |
| MID_DELALL | 0x21 | 删除所有已录入的掌静脉 |
| MID_MODULE_ID | 0xAC | 获取模组ID,唯一标识 |
### 3.1 设备初始化完成
模组上电初始化完成后,会通过串口向主控发送一条 NID 为 NID_READY 的 MID_NOTE 消息: 0xEF 0xAA 0x01 0x00 0x01 0x00 0x00。(消息详细解释见 `模组状态上报(MID_NOTE)`)。
> 该消息仅支持使用串口连接,使用CDC不会上报此消息
主控在接收到 MID_NOTE 信息后,可以和模组进行指令交互。
### 3.2 模组复位(MID_RESET)
模组同一时刻,只能执行一个任务,当模组在执行耗时长的任务时(例如掌静脉识别 MID_VERIFY),主控可以向模组下发 MID_RESET 打断取消当前任务,进而再去执行其它任务。
该指令无需携带参数。
指令执行结束后,通过消息 MID_REPLY 返回结果:
- 0x00(MR_SUCCESS):复位成功
- 0x05(MR_FAILED4_UNKNOWNREASON):未知错误
### 3.3 掌静脉识别(MID_VERIFY)
主控下发该指令给模组,模组开始检测摄像头图像中的掌静脉,并和底库中的掌静脉进行比对。指令下发携带的参数 msg_verify_data 定义如下:
```c++
struct msg_verify_data {
uint8_t reserved;
uint8_t timeout;
};
```
参数说明:
- reserved:保留字段,暂未使用。需设置为 0x00。
- timeout:识别超时时间,默认为10s,用户可以自行设置(最大不超过255s)。**主控等待模组录入应答的超时时间应大于此参数设置值。**
主控下发消息格式如下:
SyncWord | MsgID | DataSize | Data | ParityCheck | |
---|---|---|---|---|---|
2 bytes | 1 byte | 2 bytes | 2 bytes | 1 byte | |
0xEF 0xAA | MID_VERIFY (0x12) |
0x02 | reserved (1 byte) |
timeout (1 byte) |
SyncWord | MsgID | DataSize | Data | ParityCheck | RID | Result | ResultData | |
---|---|---|---|---|---|---|---|---|
2 bytes | 1 byte | 2 bytes | N bytes | 1 byte | ||||
0xEF 0xAA | MID_REPLY (0x00) |
0x26 | MID_VERIFY (0x12) |
Result (1 byte) |
user_id (2 bytes) |
username (32 bytes) |
reserved (2 bytes) |
SyncWord | MsgID | DataSize | Data | ParityCheck | ||
---|---|---|---|---|---|---|
2 bytes | 1 byte | 2 bytes | N bytes | 1 byte | ||
0xEF 0xAA | MID_REPLY(0x00) | RID(1 byte) | Result(1 byte) | ResultData( N-2 bytes) |
SyncWord | MsgID | DataSize | Data | ParityCheck | |
---|---|---|---|---|---|
2 bytes | 1 byte | 2 bytes | N bytes | 1 byte | |
0xEF 0xAA | MID_NOTE(0x01) | NID(1 byte) | NoteData( N-1 bytes) |