refactor(pro): 升级了上位机和下位机的通信协议

1. 长度字段增加到4个字节表示
2. 去除了涉及喷阀等的无关描述和未使用的命令
3. 修改了设置相机触发对应的脉冲数的命令,使得能够适应更多的相机数量
4. 添加了下位机工作流程与通信有关的描述

BREAKING CHANGE: 需要修改上位机以及下位机的应用程序,否则不能通信
This commit is contained in:
Miaow 2023-05-05 17:01:58 +08:00
parent faae382955
commit fe7b3308bc
2 changed files with 54 additions and 30 deletions

View File

@ -1 +1 @@
1.3
1.4

View File

@ -1,39 +1,63 @@
# 下位机和上位机通信协议 V1.3
# 下位机和上位机通信协议 V1.4
| 起始 | 长度高 | 长度低 | 类型高 | 类型低 | 数据字节1 | ... | 数据字节n | 校验低 | 校验高 | 结束 |
| ---- | ------ | ------ | ------ | ------ | --------- | ---- | --------- | ------ | ------ | ---- |
| 0xAA | 0x00 | 0x0A | 's' | 't' | | | | 0xFF | 0xFF | 0xBB |
工作在OSI5~7层单播TCP/IP。下位机控制阀为客户端上位机负责识别为服务端
**长度**=数据字节数+2组成一个无符号16位数校验字节随意给值即可
- 灵活利用类型字段实际值区分数据和指令
- 安全高效的长度定义应对TCP/IP分粘包特性
- 字符序列形式简洁直观,方便抓包调试
**类型**
## 流程
- 命令
下位机上电后40s完成启动初始处于停止状态。
- 开始命令 st**长度**3**数据**0xFF
- 停止命令sp**长度**3**数据**0xFF
- 测试命令te**长度**10数据为十进制字符串'0''0''0''0''0''0''5''0'表示值50'5'在前,'0'在后
- 停止测试tt**长度**3**数据**0xFF
- poweron命令po**长度**3**数据**0xFF
- 设置相机触发周期对应的脉冲数sc**长度**10数据为十进制字符串'0''0''0''0''0''0''5''0'表示值50'5'在前,'0'在后
- 设置阀板动作对应的脉冲数sv**长度**10数据为十进制字符串'0''0''0''0''0''0''5''0'表示值50'5'在前,'0'在后
- 设置相机触发到阀板动作的延迟脉冲数sa**长度**10数据为十进制字符串'0''0''0''0''0''0''5''0'表示值50'5'在前,'0'在后
- 数据命令da **长度**为视需求而定,数据要有(**长度**-2个字节
要开始分选,下位机应处于停止状态,上位机先设置各个相机触发周期对应的编码器脉冲数,然后发送开始分选指令
- 数据
收到开始分选指令后,下位机进入正在分选状态,依据编码器脉冲和设定,触发相机拍摄
数据就是阀数据,其实这是一个命令,也就是数据命令'da'分到数据这一节写是因为它的参数格式和其他命令不同下表为字节排序接收时从右往左也就是数据字节1先接收到然后是数据字节2最后是数据字节(m-1)。
上位机发送停止分选指令时,下位机应处于正在分选状态,下位机收到后停止读入编码器脉冲和触发相机,并进入停止状态。停止状态下下位机忽略收到的喷阀数据
阀1代表面向各块阀板最靠近右边的阀所以最左边的为阀n
## 格式
| 数据字节(m-1) | 数据字节(m-2) | ... | 数据字节2 | 数据字节1 | 数据字节0 |
| ------------- | -------------- | ---- | --------- | --------- | --------- |
| 阀n~(n-7) | 阀(n-8)~(n-15) | ... | 阀24-17 | 阀16-9 | 阀8-1 |
一包数据由8'haa打头8'hbb结束共6个字段
对于各个字节其中的位是这么对应的以数据字节2为例
| 起始 | 长度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 |
| 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 阀8 | 阀7 | 阀6 | 阀5 | 阀4 | 阀3 | 阀2 | 阀1 |
### 起始&结束
需要注意的是这里的数据不是ascii编码的是直接的数据字节。上面描述字节排序的表为hostcomputer图像中的一行对应的阀动作一共若干行发送完一行后接着发送下一行直到最后一行。因此一共有(行数*m)个字节的数据。
起始为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一致