PD3.1详解 第三章(EPR)扩展消息详解
在PD3.0版本中扩展消息用到的比较少,但是在PD3.1中随着要广播EPR的PDO,那么必须要引入扩展数据了;这一部分刚开始比较难以理解,得多看几遍才行;
我们都知道PD的协议层中包含了3大类的消息类型,控制消息,数据消息还有今天所说的扩展消息;
扩展消息也就是在消息头中的最高位也就是Extended 这个bit为1的数据类型,如下图:
那么它整体的数据结构如下图:
那么主要需要关注的是Extended Header和随后的data;也就是扩展消息头和它的数据;扩展消息头如下图所示定义:
第一个是Chunked 这个bit;翻译过来就是“块”,刚开始怎么翻译都感觉不太对劲,需要结合上下文多看多理解才行;这个bit是1还有0是根据前面的source部分的source cap(PDO)数据中的bit24: Unchunked Extended Messages Supported还有sink端的request数据中的bit23 Unchunked Extended Messages Supported,这俩个bit决定的;对应关系如下图:
有兴趣的可以加扣扣876275241交流、WX搜索“DSX电源超级快充”
就是说只有source和sink俩端都支持不分块(unchunked),那么后续的扩展数据中的chunked才能为0;但凡有一个为0(不支持不分块,就是仅支持分块),那么这个chunked就要为1;也就是向另外一个端口妥协;另外当我们不分块的时候,data size就表示数据大小了,消息头中的object number就得为0了;
上面这部分理解了,后面就好搞了;
Chunked number:表示的是在chunked为1的时候,存在比较多的数据要发送,那么一条扩展数据抛开header和extended header只能负载26个byte,多出来的要进行下次的请求发送,也就是request chunked;这个时候要根据数据量去给这个chunked number赋值;
Data size:这个就好理解了
在chunked为1的时候:这个就是扩展数据的有效数据的字节数;不包含消息头和扩展消息头,但是包含了为了凑齐4字节的数据;
在chunked为0的时候:就不用上面那么麻烦了,直接一次就把所有数据发完了,不用计算为了凑齐4字节的数据;
凑齐4字节,也就是一个object,如下图去凑,就是往上写0:
在这个图里的B0B1就是凑的0,但是如果你的有效数据刚好加上扩展头的2字节,能够整除4,那就不需要补0了;
PD协议中也举例子说明了,还有图示,分别讲了chunked为1和chunked为0的情况;首先是chunked为0的情况:
可以看到chunked为0,那就是不分块,主机发出指令,power那边要回复30个字节大小的数据,加上消息头和扩展头,都有了34字节了,这个时候明显超过了一般数据的大小(30字节),但是就是因为不用分块,可以一条消息直接发完;
接下里就是chunked为1的情况:
这个时候如果要发送的数据超过了30字节(包含消息头和扩展头),那么就要多次发送了;并且涉及到了request chunked这个扩展消息命令;如下图:
Power端是分俩次才把数据发完;总共需要发送30个字节,第一次抛开消息头和扩展消息头还有凑的0,只能发出去26字节;第二次还需要发送4字节,那么可以看到上图中的第二次发送,必须要有2个object(因为要有2字节的0凑数,以及扩展头的2字节),所以我们看到的是number of data objects是2;其实有效负载的数据只有4字节;
同时可以看下在chunked为0是的扩展数据结构是如下图所示:
Chunked为1的时候是下面俩张图:
兄弟姐妹们,看完的点个赞;
兄弟姐妹们,看完的点个赞;
兄弟姐妹们,看完的点个赞;