您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > RM2016DBUS协议完全解析
RM2016DBUS协议完全解析1/6提要:本文主要内容为DBUS协议的解析与相关的编程建议和部分代码。首先,大家应该都知道DBUS协议是232电平的,而我们的单片机是TTL电平,所以在你刚拿到心爱的遥控器和接收机时,他们是不能直接接上单片机使用的,信号需要先经过一次处理,也就是电平要先被反向。反向的方法很多,三极管/光耦/门电路等等。最简单的方法自然是用三极管,下面附上电路图,不做赘续。图注:电平取反电路(232电平转TTL电平)如果你的取反电路做好了,那么恭喜你,你可以开始研究接收器的数据流了。让我们拿出USB转串口小模块,将电路连接好,看一看接收器接收到的数据流。参数设定为波特率100000,停止位1,数据位8,偶校验,16进制显示。图注:USB转串口模块,电平取反模块,接收器及遥控器连接RM2016DBUS协议完全解析2/6图注:接收器配置及其接收到的数据流让我们抽取其中一段数据:000000000000000000000000000420000178000000000000000000000000000420000178000000000000000000000000000420000178000000000000000000000000000420000178000000000000000000000000000420000178000000000000000000000000000420000178000000000000000000000000000420000178重复的数据段持续出现,说明数据流的规律已经被找到了。拨动摇杆,数据有改变但18个数据为一帧数据始终不变。找出了具体每帧的数据,那么我们就可以按帧来抽出数据进行下一步的研究了。一帧数据的构成:一帧数据共有18个2位16进制数,即18个字节构成,让我们随意抽取一帧将其编号为0~17位,每个字节为1位,记录相对应的数据并列出一张表:01234567891011121314151617(位)0000000000000000000000006C0120000168(数据)【注:为了下面的解说,我将通道0拨到了最左边,这是为了避免第12位为00的问题。】经过反复的对比试验,得出的结论是前12位(0位~11位)始终为00,这点要牢牢记住因为与商用版DBUS协议中所规定的【每帧数据以00开头以0F结尾】不同的是,RM版的DBUS协议并没有起始帧和结束帧,所以我们在处理数据流时,这一串的00是我们判断数据的开RM2016DBUS协议完全解析3/6始与结束的唯一手段。帧的开始与结束问题的具体细节在后面程序部分会提到,先让我们来看各通道数据的处理。我们先将上面那一帧数据中的有效部分抽出来并写成二进制的格式:6C0120000168011011000000000100100000000000000000000101101000然后我们要对各通道的进行分割重组。根据协议,CH0~CH3每个通道为11位二进制,CH4~CH5每个通道为2位二进制。再根据DBUS的构成规则,我们可以作如下分割并命名为DATA0~5:6C(DATA0)01(DATA1)20(DATA2)00(DATA3)01(DATA4)68(DATA5)011011000000000100100000000000000000000101101000CH0:高3位为DATA1的低3位,低8位为DATA0的全8位;CH1:高6位为DATA2的低6位,低5位为DATA1的高5位;CH2:高1位为DATA4的低1位,中8位为DATA3的全8位,低2位为DATA2的高2位;CH3:高4位为DATA5的低4位,低7位为DATA4的高7位;CH4:全2位为DATA5的高2位;CH5:全2位为DATA5的中2位。如果还不理解,那么没关系,我把具体移位用线和箭头画了出来:6C0120000168011011000000000100100000000000000000000101101000CH000101101100=364CH110000000000=1024CH210000000000=1024CH310000000000=1024CH401=1CH510=2用一句话概括起来就是:DATA中的低位位于较前的通道中的较高位,高位位于较后通道中的较低位。即分割DATA时,我需要多少位,就从后往前数多少位;但读取时,从有这个通道的数据的最后方的DATA开始往最前方的DATA读,但读取具体数字的顺序仍为从左到右。放到程序里说,我们的处理方法一般分两种:DMA与读BUF。在我个人的理解中:DMA的好处是:我接收到的串口数据中包含的通道数据是先来低位再来高位的,用DMA就可以很方便的将各通道数据从底部(低位)往顶部(高位)堆,一帧数据结束时我的数组RM2016DBUS协议完全解析4/6也堆满了,就可以送去给相关的函数处理了。读取BUF的好处是:处理时每一步都有清晰易懂的逻辑性,虽然处理消耗资源多且耗时,但是编程逻辑简单,语法简单。一开始我在写DBUS程序的时候并没有各类资料,只有张数据结构图,所以我用的是读取BUF的方法。我的程序的具体操作为:建立一个[6][8]数组【注:[6]个DATA的[8]位二进制】,在每一帧数据接受完成后将各DATA的数据转为二进制并按位存进数组。很简单的逻辑,二位十六进制变为了八位二进制。【注:Keil中,十六进制和十进制本质是一样的,不同之处只在于表达形式是十六进制还是八进制,故直接调用就好了,无需进行16=8的进制转化,然而Keil中没有二进制,故不得不用此方法将其转化为二进制。】然后,我们按照前文中的分析整理规则,将各数字重新按各自应有的位置转化为十进制就能得到需要的数据了。截图只截一半,后面请理解协议后自行扩展完整。至此,我们就得到了各通道的数据。不要忘了,以上的处理是建立在我们知道数据何处开始何处结束的基础上的。那么我们如何寻找数据的入点和出点?让我们继续看这张表:01234567891011121314151617(位)0000000000000000000000006C0120000168(数据)让我们再往后写一些:0000000000000000000000006C01200001680000000000000000000000006C01200001680000000000000000000000006C0120000168RM2016DBUS协议完全解析5/6不难发现,若一串数据【0~11位都为00,且18位也为00】,则可以断定12~17位为我们所需要的数据。由此容易得出寻找开头的逻辑应为:程序判断是否符合【0~11位都为00,且18位也为00】,若满足则读取12~17位并处理,若不满足则舍弃第一位并将所有数据前移一位,下次接收的数据存入18位并再次判断是否符合条件。附一个判断过程演示:01680000000000000000000000006C01200001×【不符合,向前移位,等待新数据。】680000000000000000000000006C0120000168×【不符合,向前移位,等待新数据。】0000000000000000000000006C012000016800√【符合,读取12~17位数据为6C0120000168,后向前移位等待新数据。】00000000000000000000006C01200001680000×【不符合,向前移位,等待新数据。】附上判断及移位程序。图注:判断是否为完整数据帧程序图注:移位程序【附件中上传了文中使用到的的串口助手,因为有的旁友表示我们家的串口助手不能设置自定义波特率啊!!!】至此全文完!其中有一些程序上的细节并没有给出但应该不是问题,主要还是理解至上照搬为下嘛。最后预祝大家新年快乐,研发顺利。欢迎各路大神与我探讨各类机械,电子方面遇到的问题,视觉就算了涉及因为本人比较渣暂时还玩不转Ubuntu。李庆之,Q352303152最后一页留给水印,RM神教万岁!+1s!RM2016DBUS协议完全解析6/6
本文标题:RM2016DBUS协议完全解析
链接地址:https://www.777doc.com/doc-1840079 .html