PM5据说是专业划船训练中最主流的一个方案,最近恰好有个项目要用这个东西,记录下这个协议。官方文档这里有个链接
另外官方有个测试的工具,链接在这里,里面有个demo可以测试协议什么的。
接口
CSAFE这个协议有几种实现方式,蓝牙、USB、网口,不同版本的表头支持的接口也不太一样,总的看来USB是都有的
协议内容
一个包的构成大概是这样的
其中一些特定的byte定义是下面这样的
状态机
CSAFE定义了一个状态机,PM5会在几种状态之间流转。下面说明了是如果在几种状态之间转换的。
发起一次训练
文档里写了一个这样的发起训练的样例,但是我自己测试的时候发现不完全一样。
最开始的F1 80 80 F2
中F1是Standard Frame Start Flag,80表示查询状态,其他的指令可以看下面的这个表,第二个80是校验位,是前面所有除了Start Frame Flag和Stop Frame Flag以外所有字节的异或。
返回F1 07 07 F2
中的07可以看下面的表
实际上我的PM此时是READY所以我的返回是
F1 01 01 F2
和F1 81 81 F2
交替出现的(因为Frame Toggle)
PM扩展协议
image.png在C2自己的示例代码中有一个是这样写的04 F1 1A 02 89 A3 A3 A6 B4 83 F2
,其中04的定义为PM_REPORT_ID
但是我没在手册中看到这个定义,1A应该就是CSAFE_SETUSERCFG1_CMD
,02是两个byte,后面的的89和A3在下面定义的
后面的
A3 A6 B4
应该是在「发起一次训练」这里的指令
对于C2 Proprietary Long Get Data Commands这类需要附加data的指令也是一样类似的「指令+data长度+data bytes」这样的结构,比如我试了下0x6E这个指令,应该是发送04 F1 1A 03 6E 01 00 xx F2
这样的指令获取数据
他的返回值是这样的
04 F1 01 1A 0A 89 01 01 A3 05 8A 16 00 00 09 A3 02 00 00 A6 03 F9 00 39 B4 03 00 00 58 80 F2
其中04应该是对应发送的04,01看上面的Table 9,1A 0A表示1A返回了10个byte,89 01 01 表示89返回Workout type 为1,A3 05 8A 16 00 00 09表示A3返回Work Distance为168A=5770除以10等于 577m,09手册上说的是Fractional Work Distance,我不是很理解(2022年6月3日UPDATE:原来表示的是距离的小数部分)。后面的A3表示CSAFE_GETCALORIES_CMD返回的值是0000, A6 03 F9 00 39表示CSAFE_GETPACE_CMD返回的是F9=249,Units Specifier是39,B4 03 00 00 58表示CSAFE_GETPOWER_CMD返回的是0000,Units Specifier是58,80是XOR校验
网友评论