From fe7b3308bc7cf5601ae032b45b35904616d002aa Mon Sep 17 00:00:00 2001 From: Miaow <3703781@qq.com> Date: Fri, 5 May 2023 17:01:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pro):=20=E5=8D=87=E7=BA=A7=E4=BA=86?= =?UTF-8?q?=E4=B8=8A=E4=BD=8D=E6=9C=BA=E5=92=8C=E4=B8=8B=E4=BD=8D=E6=9C=BA?= =?UTF-8?q?=E7=9A=84=E9=80=9A=E4=BF=A1=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 长度字段增加到4个字节表示 2. 去除了涉及喷阀等的无关描述和未使用的命令 3. 修改了设置相机触发对应的脉冲数的命令,使得能够适应更多的相机数量 4. 添加了下位机工作流程与通信有关的描述 BREAKING CHANGE: 需要修改上位机以及下位机的应用程序,否则不能通信 --- protocol/version | 2 +- protocol/下位机和上位机通信协议.md | 82 +++++++++++++++++++----------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/protocol/version b/protocol/version index a58941b..840ca8c 100644 --- a/protocol/version +++ b/protocol/version @@ -1 +1 @@ -1.3 \ No newline at end of file +1.4 \ No newline at end of file diff --git a/protocol/下位机和上位机通信协议.md b/protocol/下位机和上位机通信协议.md index fe28de7..4fd47cc 100644 --- a/protocol/下位机和上位机通信协议.md +++ b/protocol/下位机和上位机通信协议.md @@ -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 | +上位机发送停止分选指令时,下位机应处于正在分选状态,下位机收到后停止读入编码器脉冲和触发相机,并进入停止状态。停止状态下下位机忽略收到的喷阀数据 -​ 对于各个字节,其中的位是这么对应的,以数据字节2为例 +## 格式 -| 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 | -| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | -| 阀8 | 阀7 | 阀6 | 阀5 | 阀4 | 阀3 | 阀2 | 阀1 | +一包数据由8'haa打头,8'hbb结束,共6个字段: -​ 需要注意的是,这里的数据不是ascii编码的,是直接的数据字节。上面描述字节排序的表为hostcomputer图像中的一行对应的阀动作,一共若干行,发送完一行后接着发送下一行,直到最后一行。因此一共有(行数*m)个字节的数据。 \ No newline at end of file +| 起始 | 长度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$
`长度1`指length[31:24],`长度2`指length[23:16],`长度3`指length[15:8],`长度4`指length[7:0] + +### 类型&数据 + +类型为ASCII字符序列,比如`类型1`为's',`类型2`为't'代表开始分选命令
数据为ASCII字符序列或原始数据 + +**开始分选指令**
`类型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 | + +**停止分选指令**
`类型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 | + +**设置相机触发周期对应的编码器脉冲数**
对于相机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一致