超级串口通信协议
02
命令帧
这是一帧传输命令的帧
03
状态帧
对命令帧的响应
○4 对在所有过程中,任何时刻,通信各方都有可能收到到 “命令帧 – 重传上一帧”的
命令请求. 后文解释各帧中, 不再分别解释.
○5 对于通信的任何一端, 它发送的任何帧都应该得到对方对此帧的应答,通信必须是”
有去有回”
○6 一次通信过程可以由任何一端发起, 任何端接收到空闲帧,返回 “状态—ok”并且结
不同系统中对数据类型的区别由用户自行定义
c. 总长度: 表示此次请求需要的数据总量 c. 单帧最大长度: 指出对方返回一帧数据可以携带的最大数据量(数据域长). (因为设
备接收一帧数据的 buf 是有限长的). c.对此命令的响应是 “数据帧” 或 ”空闲帧”
5.2 命令帧 ---- 接收请求
0 12 3
typedef struct
{ uint8 uint8 uint8 uint8 uint8 uint8
head;
//帧头
length_h; //帧长度高字节
length_l; //帧长度低字节
source_no; //发送设备号
directory_no; //接收设备号
type;
//帧类型
uint8 uint8
完毕.
b . 帧参数域不存在
b. 此帧的响应为 ‘状态帧 – ok’
5.4 命令帧 – 继续传输
0
12
3
4
5
6
…..
07
FF 00 08 xx
xx
02
05
不存在 xx
帧头标 记
帧长
发送端 设备号
接收端 帧类型 操作类型
设备号
帧参数 校验和
a. 此帧用于通知对方继续完成没有完成的帧传输
b. 此帧通常是用于唤起由 ‘帧命令 – 暂缓传输’ 引发的多帧传输中止,或者要求传输
6.3 状态帧 --- 信息报告
0
12
3
4
5
6
7
8
9
FF 00 0A xx
xx
03
02
xx
xx
xx
帧头 标记
帧长
发送端 设备号
接收端 设备号
帧类 操作类
型
型
帧参数
校验和
a. 此帧表明必要的报告信息, 例如对”命令帧 – 接收请求”响应时, 参数指出自身单帧 携带数据最大长度. 对不同响应下,其参数含义可以是不同的
1 //数据帧
#define command_frame 2 //命令帧
#define state_frame 3 //状态帧
//
操作类型
#define last_frame
0 //最后帧
//************ 命令帧的操作类型************************************
handle;
//操作类型
*parameter; //参数域内容指针
uint8 check_sum; //校验和
} struct_frame;
○3 在某些帧中, 帧参数域可以是不存在的
帧类型字含义表
帧类型字
类型名称
含义
00
空闲帧
通常用于通知对方传输告一段落, 通信结束
01
数据帧
这一帧以传输数据为目的的帧,
PC
MCU
请求数据
返回数据
返回 OK
返回 OK
解码
PC
MCU
请求接收数据 返回 OK 发出数据 返回 OK
请求数据 返回数据 返回 OK 返回 OK
请求数据 空帧
返回 OK 返回 OK
MCU 向 PC 请求 mp3 数据
解码
请求接收数据 返回 OK 发出数据 返回 OK
空帧 返回 OK
MCU 向 PC 发送 PCM 数据
12
3
4
5
6
…..Baidu Nhomakorabea
N
FF xx xx xx
xx
01
xx
…..
xx
帧头 标记
帧长
发送端 设备号
接收端 设备号
帧类型 操作类型 帧参数 校验和
a. 数据帧. 单纯地表示此帧中帧参数携带的是数据.
b. 帧参数携带的是需要传输的数据部分
c. 操作类型含义表
操作类型
含义/作用
00
表示该帧是结尾帧, 数据传输完毕
#define continue_transmit 5 //继续传输
/***************** 状态帧 参数 **********************/
#define state_ok 0 //ok #define state_error 1 //错误 #define state_report_message 2 //信息报告
6.2 状态帧 ---- 错误
0
12
3
FF 00 09 xx
帧头 标记
帧长
发送端 设备号
4
5
6
7
8
xx
03
01
xx
xx
接收端 设备号
操作类 帧类型
型
帧参数 校验和
a. 报告各种命令状态, 错误详情由帧参数确定 b. 错误字(帧参数) 帧参数 含义
00 未知错误 01 设备没有准备好 02 不支持上一次接受到的命令
uint8 check_sum;
//校验和
//非标准成员 uint16 para_len; } struct_frame;
//***********帧类型*********************************************
#define idle_frame
0 //空帧
#define data_frame
#define require_data_frame 1 //简单数据请求
#define ask_to_receive_data 2 //简单数据接收请求,要求对方准备接收数据
#define repeat_last_frame 3 //重复上一帧
#define stop_transmit
4 //暂停传输
b. 帧参数域不存在, c. 对此帧命令的响应是重复上一次的发送
5.3 命令帧 – 暂缓传输
0
12
3
4
5
6
…..
07
FF 00 08 xx
xx
02
04 不存在 xx
帧头标 记
帧长
发送端 设备号
接收端 帧类型 操作类型 帧参数 校验和
设备号
a. 此帧通常用于通知对方暂缓传输数据, 比如接收方对上一次接收的数据还没有处理
帧头标记: 一帧传输的起始标记, 固定为 FFH
帧长:该帧的总长度;使用两个字节表示传输一帧长度最大为 64KB,帧长=8+帧参数长度
发送端设备号: 指明该帧数据是谁发送的(源); ○1 接收端设备号: 指明该帧数据是向谁发送的(目的); ○1
帧类型:表明该帧的类型, 它可以是数据帧, 命令帧…..等等
操作类型: 表明该帧指明的具体操作, 比如命令帧中用于指明是什么命令,执行怎样的
操作
帧参数:可以是数据,状态的参数等
校验和:该帧的校验和字节,校验方法是该帧的所有数据从字节 0 到字节 N 的和必须为 0
○1 : 设备号 00 特指主机, FF 特指广播地址. 01—FE 指任意普通设备号
○2 : 帧格式结构体
通信协议
撰写 叶春勇 2011-8-26 起 版本 V 1.0
一. 为了规范所有需要的通信操作
二. 帧格式
字节
0 12
3
序号
4
5
6
…..
N
字节
FF xx xx xx 内容
xx
xx
xx
…..
xx
字节 含义
帧头 标记
帧长
发送端 设备号
接收端 设备号
操作类
帧类型
帧参数 校验和
型
(注: xx 表示恰当的某数值, zz 表示任意数值;)
度(参数长度), 如果发送端需要发送的总长度超过这个值, 则需要进行多帧拆分传输
5.2 命令帧 – 重复上一次帧传输
0
12
3
4
5
6
…..
7
FF 00 08 xx
xx
02
03
不存在 xx
帧头 标记
帧长
发送端 设备号
接收端 帧类型 操作类型 帧参数 校验和
设备号
a 要求发送端重复上一帧传输, 这通常是由接收设备发现它接收到的帧不合法, 或 者校验错误等引起的.
多帧传输中没有传输完毕的帧
c. 对此帧的应答是 ‘数据帧’
六. 状态帧
6.1 状态帧 --- ok
0
12
3
4
5
6
…..
7
FF 00 08 xx
xx
03
00
不存在 xx
帧头标 记
帧长
发送端 设备号
接收端 设备号
帧类型 操作类型 帧参数
校验 和
a. 此帧用于对各命令的确认, 一次发起的传输系列成功结束, 对消息的确认等等;
束一次传输任务,直到它收到有新的通信请求,或其自身需要引发一次传输请求.
○7 可以使用本协议的部分帧来进行通信交流, 但是此时设备收到他不使用的帧时, 应
该返回 “状态帧 ---- 错误” 错误字=2(收到不支持帧)
○8 举例; mcu 从 pc 获取 MP3 文件进行解码, 并返回解码 pcm 结果值的通信流程
0 12 3
4
5
6
7 8, 9 10,11 12
FF 00 0d xx
xx
02
01 xx xx
xx
xx
帧头 标记
帧长
发送端 设备号
接收端 帧类型
设备号
操作类 型
数据 类型
单帧最 总长度
大长度
帧参数
校验和
a. 操作类型 01 表示数据请求
b. 数据类型: 指出需要请求何种数据, 因为接收此帧数据的设备可以提供多种数据,
#define local_no #define pc_no #define frame_data_size
1 //本机地址 0 //pc 地址
512 //帧数据域数组长度
typedef struct //帧结构****************************************
{ uint8
三. 空闲帧
0
12
3
4
5
6
…..
7
FF xx 08 xx
xx
00
zz
不存在 xx
帧头 标记
帧长
发送端 设备号
接收端 设备号
帧类型 操作类型 帧参数 校验和
a. 空闲帧通常用于通知对方任务完成, 比例文件传输完毕(所有字节已经发完)
b. 对此帧的应答是 “状态帧—ok”
四. 数据帧
4.1 数据帧
0
表示该帧之后还有后续帧, 这是因为需要传输的数据量
01 比较大, 需要进行多帧传输.
d. 应答表 应答
状态帧 – ok 命令帧 – 展缓传输(只用于多帧传输中) 命令帧 --- 继续传输(只用于多帧传输中)
含义/作用 表示成功接收到数据 需要暂缓传输下一帧 要求传送下一帧
五. 命令帧 5.1 命令帧 ---- 数据请求
4
5
6
7 8, 9 10
FF 00 0b xx
xx
02
02 xx xx
xx
帧头 标记
帧长
发送端 设备号
接收端
操作类
帧类型
设备号
型
数据
总长度
类型
校验和
帧参数
a. 操作类型 02 表示通知对方准备接收数据 b. 数据类型, 总长度与 “命令帧 --- 数据请求” 相同 c.对此命令的响应是 “状态帧 --- 信息报告” 得到接收端可以接收的最大单帧数据长
head;
//帧头
uint8 uint8 uint8 uint8 uint8 uint8 uint8
length_h; //帧长度高字节
length_l; //帧长度低字节
source_no;
//发送设备号
directory_no; //接收设备号
type;
//帧类型
handle;
//操作类型
parameter[frame_data_size]; //参数域 buf
void frame_send(uint8 directory_no,uint8 type, uint8 handle,uint16 para_len); boolean frame_receive(struct_frame *frame_p);
/******** 错误字含义 ***********************************************/
#define unknown_error 0 //未知错误
#define un_ready
1 //未准备好
#define unsupport_last_command 2 //不支持上一次接收到的命令