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

BREAKING CHANGE: 需要修改上位机以及下位机的应用程序,否则不能通信
2023-05-05 17:01:58 +08:00

64 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 下位机和上位机通信协议 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一致