# 下位机和上位机通信协议 V1.4

工作在OSI5~7层，单播TCP/IP。下位机控制阀，为客户端；上位机负责识别，为服务端

- 灵活利用类型字段实际值区分数据和指令
- 安全高效的长度定义，应对TCP/IP分粘包特性
- 字符序列形式简洁直观，方便抓包调试

## 流程

下位机上电后40s完成启动，初始处于停止状态。

要开始分选，下位机应处于停止状态，上位机先设置各个相机触发周期对应的编码器脉冲数，然后发送开始分选指令

收到开始分选指令后，下位机进入正在分选状态，依据编码器脉冲和设定，触发相机拍摄

上位机发送停止分选指令时，下位机应处于正在分选状态，下位机收到后停止读入编码器脉冲和触发相机，并进入停止状态。停止状态下下位机忽略收到的喷阀数据

## 格式

一包数据由8'haa打头，8'hbb结束，共6个字段：

| 起始  | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 数据1 | 数据2 | ...  | 数据$i$ | 校验1 | 校验2 | 结束  |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :--: | :-----: | :---: | :---: | :---: |
| 8'haa | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | ...  |  8'hzz  | 8'hff | 8'hff | 8'hbb |

### 起始&结束

起始为1字节，8'haa；结束为1字节，8'hbb

### 校验&长度

校验为2字节，`校验1`为8'hff，`校验2`为8'hff

长度为一个32位无符号数length，长度 = 数据字节数$i + 2$ <br>`长度1`指length[31:24]，`长度2`指length[23:16]，`长度3`指length[15:8]，`长度4`指length[7:0]

### 类型&数据

类型为ASCII字符序列，比如`类型1`为's'，`类型2`为't'代表开始分选命令<br>数据为ASCII字符序列或原始数据

**开始分选指令**<br>`类型1`为's'，`类型2`为't'，length为3，数据1固定为8'hff，具体如下：

| 起始  | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 数据1 | 校验1 | 校验2 | 结束  |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 8'haa | 8'd0  | 8'd0  | 8'd0  | 8'd3  |  's'  |  't'  | 8'hff | 8'hff | 8'hff | 8'hbb |

**停止分选指令**<br>`类型1`为's'，`类型2`为'p'，length为3，数据固定为8'hff，具体如下：

| 起始  | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 数据1 | 校验1 | 校验2 | 结束  |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 8'haa | 8'd0  | 8'd0  | 8'd0  | 8'd3  |  's'  |  'p'  | 8'hff | 8'hff | 8'hff | 8'hbb |

**设置相机触发周期对应的编码器脉冲数**<br>对于相机a，`类型1`为'p'，`类型2`为'a'，length为10，数据为十进制的ASCII字符序列，不足补'0'，比如'0''0''0''0''0''2''3''1'表示每231个编码器脉冲触发一次相机：

| 起始  | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 数据1 | ...  | 数据7 | 数据8 | 校验1 | 校验2 | 结束  |
| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ---- | ----- | ----- | ----- | ----- | ----- |
| 8'haa | 8'd0  | 8'd0  | 8'd0  | 8'd10 | 'p'   | 'a'   | '0'   | ...  | '3'   | '1'   | 8'hff | 8'hff | 8'hbb |

对于相机b，`类型1`为'p'，`类型2`为'b'，其余字节含义和用法与相机a一致

对于相机c，`类型1`为'p'，`类型2`为'c'，其余字节含义和用法与相机a一致

对于相机d，`类型1`为'p'，`类型2`为'd'，其余字节含义和用法与相机a一致
