ssclark 发表于 2011-6-16 17:49:04

DMX512数据包发送时,break信号通过什么来实现?是串口信号是不行的,用IO来实现吗?同样,接

DMX512数据包发送时,break信号通过什么来实现?是串口信号是不行的,用IO来实现吗?同样,接收端如何检测break信号???

DMX—512协议规定的数据包如下:

http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_649408GIN0QY.jpg
(原文件名:QQ截图未命名.jpg)

如上图中,Start Code 和接下来的512个数据都是标准的11位异步串口信号(一个启始位、8位数据、两个停止位)

这些都可以用标准UART来发送,接收端也用标准的UART接收即可。

可是这个数据包的头标志 break 信号是怎么来实现的呢?UART?串口不可能发送出这个的信号来的啊,

并且 break 规定不得小于88us(22,DMX-512的速率为25kbps)

同样,接收端用什么方法来处理呢?

希望做过这个协议的高手帮帮我啊~~~万分感谢

chenyuqiu 发表于 2011-6-16 18:12:34

楼主是做舞台灯光行业的吧?

chenyuqiu 发表于 2011-6-16 18:19:38

我就是从事这个行业的,所以DMX512在每个产品上都得用到,很简单,不用去理那个时序图,就直接用485搞定了,用9位收发模式,波特率为250K/S。在接收时先判断第九位是不是为0。接收到第一个第九位位0后接下来的第二个数据的第九位就是为1的了,这两个数据就是DMX512的识别码,数值都是0x00, 0x00。收到这两个识别码数据后紧跟着就是接收512个字节的数据。
发送的时先发第九位为0的数据,然后再发第九位为1的数据,紧跟着就发送你想要发送的数据流了。明白了吗?

dmxfeng 发表于 2011-6-16 18:32:31

chenyuqiu 小陈 好人一个!

llssr 发表于 2011-6-16 18:39:20

DMX512速率是250kbps吧那个检测接在一个io口就可以了啊

xiaowu191 发表于 2011-6-16 18:39:36

我看你都搜索过论坛的贴了,其他就不说了;

楼主的图是自己画的吗?串口数据没有起始位了;

chenyuqiu 发表于 2011-6-16 19:38:49

回复【3楼】dmxfeng
chenyuqiu 小陈 好人一个!

-----------------------------------------------------------------------

过奖了,谢谢~~

chenyuqiu 发表于 2011-6-16 19:39:50

回复【5楼】xiaowu191 我看你都搜索过论坛的贴了,其他就不说了;
楼主的图是自己画的吗?串口数据没有起始位了;
-----------------------------------------------------------------------

小屋老板也是好人一个!!

ssclark 发表于 2011-6-17 10:53:35

楼主位贴的图其实不是特别清楚,因为数据那里缺少一个“0”的起启位,DMX规定数据是11位的(1个起始位,8个数据位,2个停止位)

所以一个完整的数据是用9位收发模式的,波形应该是这样的:

不知道为什么图片传不上来



回复【2楼】chenyuqiu小陈
我就是从事这个行业的,所以dmx512在每个产品上都得用到,很简单,不用去理那个时序图,就直接用485搞定了,用9位收发模式,波特率为250k/s。在接收时先判断第九位是不是为0。接收到第一个第九位位0后接下来的第二个数据的第九位就是为1的了,这两个数据就是dmx512的识别码,数值都是0x00, 0x00。收到这两个识别码数据后紧跟着就是接收512个字节的数据。
发送的时先发第九位为0的数据,然后再发第九位为1的数据,紧跟着就发送你想要发送的数据流了。明白了吗?
-----------------------------------------------------------------------


“在接收时先判断第九位是不是为0。接收到第一个第九位位0后接下来的第二个数据的第九位就是为1的了,这两个数据就是dmx512的识别码,数值都是0x00, 0x00。”这个第九位是什么数据,是第一个为“0”的起启位呢还是8位数据位中的第8位呢?为什么先“0”后“1”就能作为DMX512的识别码了呢??这样还符合DMX512协议的规范吗??





回复【5楼】xiaowu191小屋
我看你都搜索过论坛的贴了,其他就不说了;
楼主的图是自己画的吗?串口数据没有起始位了;
-----------------------------------------------------------------------




这个图确实有点问题,少了起始位,图摘于PIC的一篇文档,如下:
还是传不上来,稍后再试试

chenyuqiu 发表于 2011-6-17 11:05:10

回复【8楼】ssclark
楼主位贴的图其实不是特别清楚,因为数据那里缺少一个“0”的起启位,dmx规定数据是11位的(1个起始位,8个数据位,2个停止位)
所以一个完整的数据是用9位收发模式的,波形应该是这样的:
不知道为什么图片传不上来
回复【2楼】chenyuqiu小陈
我就是从事这个行业的,所以dmx512在每个产品上都得用到,很简单,不用去理那个时序图,就直接用485搞定了,用9位收发模式,波特率为250k/s。在接收时先判断第九位是不是为0。接收到第一个第九位位0后接下来的第二个数据的第九位就是为1的了,这两个数据就是dmx512的识别码,数值都是0x00, 0x00。收到这两个识别码数据后紧跟着就是接收512个字节的数据。
发送的时先发第九位为0的数据,然后再发第九位为1的数据,紧跟着就发送你想要发送的数据流了。明白了吗?
--------------------------------......
-----------------------------------------------------------------------

我在这里要先说一下,按照我那种方法不是标准的DMX512规范来的,但是很通用,也很方便,如果是做DMX512控台之类的东西那一定要按照DMX512标准协议来做。
至于你的疑问“这个第九位是什么数据,是第一个为“0”的起启位呢还是8位数据位中的第8位呢?为什么先“0”后“1”就能作为DMX512的识别码了呢??”
这个就按照485来做就行了,9位数据模式。

ssclark 发表于 2011-6-17 11:19:13

回复【9楼】chenyuqiu小陈
-----------------------------------------------------------------------

目前只做接收端的部分,就是灯具这一部分

也就是用9位数据模式来接收对吧?可以主控台发送来的是标准的DMX信号,8位数据啊?还是不懂这第九位是什么,以前也没做过485

chenyuqiu 发表于 2011-6-17 11:30:34

回复【10楼】ssclark
回复【9楼】chenyuqiu小陈
-----------------------------------------------------------------------
目前只做接收端的部分,就是灯具这一部分
也就是用9位数据模式来接收对吧?可以主控台发送来的是标准的dmx信号,8位数据啊?还是不懂这第九位是什么,以前也没做过485

-----------------------------------------------------------------------

可以接收到标准DMX512控台发送来的数据的

ssclark 发表于 2011-6-17 17:47:03

回复【11楼】chenyuqiu小陈
回复【10楼】ssclark
回复【9楼】chenyuqiu小陈
-----------------------------------------------------------------------
目前只做接收端的部分,就是灯具这一部分
也就是用9位数据模式来接收对吧?可以主控台发送来的是标准的dmx信号,8位数据啊?还是不懂这第九位是什么,以前也没做过485
-----------------------------------------------------------------------
可以接收到标准dmx512控台发送来的数据的
-----------------------------------------------------------------------


研究了半天,还是不理解你这种接收方式是如何接收校准的DMX信号??希望你详细解释下,尤其是如何识别出break信号,万分感谢啊

ssclark 发表于 2011-6-17 18:06:04

回复【11楼】chenyuqiu小陈
-----------------------------------------------------------------------

这种接收发送的方法比较适合发送端和接收端都是自己的系统

如果只做接收端,那么控制台如果是完成符合标准DMX协议的信号的话,不敢保证这样能不能接收到信号

如果只做控制台的话,那更不可取了,因为一旦正规的灯具是使用判断break信号的长度之类来识别的话

那么控制台就完全不符合协议规定了

2233223 发表于 2011-6-17 18:21:23

楼上说得没错,并不所有的控台出来的信号都能这样接收。
更不能用这种方法发送数据包控制别家的接收端设备。

xiaowu191 发表于 2011-6-17 18:22:37

回复【10楼】ssclark
回复【9楼】chenyuqiu小陈
-----------------------------------------------------------------------
目前只做接收端的部分,就是灯具这一部分
也就是用9位数据模式来接收对吧?可以主控台发送来的是标准的dmx信号,8位数据啊?还是不懂这第九位是什么,以前也没做过485

-----------------------------------------------------------------------

就是把DMX512协议所谓的“第一个停止位”当第9位数据来看,在接收数据流的时候,这位数据RB8(即是所谓的“第一个停止位”)肯定是1;

再看一下break信号的时候,下降沿的时候,串口接收开始,而这个低电平的保持时间肯定是超出250K波特率时11位数据的时间;
据我所知,51/avr单片机都是在停止位(不管是不是有效停止位(希望高手能确认一下,这个问题困扰我很久了))中间时刻既接收完毕并置位中断请求标志;这个时候你接收到的RB8肯定是0;

这样就区别开来了。

这是简单有效的一种方法,但是关于break信号,请找一下以前一个贴子里面bbs2009大侠的说法;

xiaowu191 发表于 2011-6-17 18:52:32

回复【7楼】chenyuqiu小陈
回复【5楼】xiaowu191 我看你都搜索过论坛的贴了,其他就不说了;
楼主的图是自己画的吗?串口数据没有起始位了;
-----------------------------------------------------------------------
小屋老板也是好人一个!!

-----------------------------------------------------------------------

哈哈,我打工的一个,还望陈总关照!

ssclark 发表于 2011-6-17 18:59:09

回复【15楼】xiaowu191小屋
-----------------------------------------------------------------------

恩,这种方法我是理解了~~

我有看到有关文献写到对这个break信号采用时间来判断,即同时将接收到的信号接入外总中断,

进入中断计时,判断有效长的低电平则认为是break信号,个人觉得这种方法比较规范,为什么很少有人这么做呢??

xiaowu191 发表于 2011-6-17 19:08:52

回复【17楼】ssclark
回复【15楼】xiaowu191小屋
-----------------------------------------------------------------------
恩,这种方法我是理解了~~
我有看到有关文献写到对这个break信号采用时间来判断,即同时将接收到的信号接入外总中断,
进入中断计时,判断有效长的低电平则认为是break信号,个人觉得这种方法比较规范,为什么很少有人这么做呢??

-----------------------------------------------------------------------

要判断时间不一定就是要外部中断吧,你检测到RB8==0时再判断一段时间就可以了,这样做并不会丢掉下一个数据;

接外部中断多占资源啊,一串数据要中断那么多次

xiaowu191 发表于 2011-6-17 19:12:55

我感觉,真正能用得巧的是不会写文献的;很多也不能写文献,都知道黄灯时猛踩油门,但不能摆在台面说;

chenyuqiu 发表于 2011-6-18 11:26:14

回复【19楼】xiaowu191 小屋
我感觉,真正能用得巧的是不会写文献的;很多也不能写文献,都知道黄灯时猛踩油门,但不能摆在台面说;
-----------------------------------------------------------------------

呵呵,屋老板说得好啊!!!

ssclark 发表于 2011-6-18 15:39:55

回复【19楼】xiaowu191小屋
我感觉,真正能用得巧的是不会写文献的;很多也不能写文献,都知道黄灯时猛踩油门,但不能摆在台面说;
-----------------------------------------------------------------------


这个比喻灰常好啊~~~

ssclark 发表于 2011-6-20 11:39:35

回复【15楼】xiaowu191小屋
回复【10楼】ssclark
回复【9楼】chenyuqiu小陈
-----------------------------------------------------------------------
目前只做接收端的部分,就是灯具这一部分
也就是用9位数据模式来接收对吧?可以主控台发送来的是标准的dmx信号,8位数据啊?还是不懂这第九位是什么,以前也没做过485
-----------------------------------------------------------------------
就是把dmx512协议所谓的“第一个停止位”当第9位数据来看,在接收数据流的时候,这位数据rb8(即是所谓的“第一个停止位”)肯定是1;
再看一下break信号的时候,下降沿的时候,串口接收开始,而这个低电平的保持时间肯定是超出250k波特率时11位数据的时间;
据我所知......
-----------------------------------------------------------------------

我用9位的来接收,发现数据都有溢出错误??怎么回事啊?

ssclark 发表于 2011-6-20 15:55:02

请教个串口通信的问题:

接收端没有正确接收停止位怎么办?是一直等待停止位到来呢还是继续接收覆盖以前的数据直到停止位到来啊???

知道的兄弟教一下啊,谢谢主了

xiaowu191 发表于 2011-6-20 22:42:05

回复【22楼】ssclark
-----------------------------------------------------------------------

能说一下现象吗?是怎么判断溢出的?



回复【23楼】ssclark
-----------------------------------------------------------------------

你用的是什么芯片,51/avr都是在"停止位时间"置位中断;

ssclark 发表于 2011-6-21 13:25:28

回复【24楼】xiaowu191小屋
-----------------------------------------------------------------------

我用的瑞萨的片子同,R8C/2L

如下图所示,数据也是停止位是转存到寄存器里的:

http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650774I3LGJF.jpg
(原文件名:QQ截图未命名.jpg)

本来接收到的数据都有溢出错误,我是看内存的:一块单片机发送DMX信号,另一块单片机在线调试,接收。

DMX信号循环在发送,我将在线接收到的16位数据(包括各种帧错误标志位)全部转存到一个数组里,然后通过刷新内存地址来看

具体的数据是多少,不是通过在中断设断点来查看。

后来我在进入接收中断后不允许接收,出中断前再允许接收,这样就没有了溢出错误了。

我发送的DMX信号是这样的:break + start code + 10个"0xaa"数据

正确的应该是接收到“0000,0100,01aa,01aa,01aa,01aa,01aa,01aa,01aa,01aa,01aa,01aa”

可有时候发现数据是错的,有时候10个aa中出现一个其他数据,有时候没有0000,不知道是哪里错了

ssclark 发表于 2011-6-22 20:14:53

回复【24楼】xiaowu191小屋
-----------------------------------------------------------------------

现在能接收到正常的数据了,包括 break 信号(第9位为0,其余8位也为0)和 Start Code 信号(第9位为1,其余8位为0)

前面提到的接收不到 break 信号,在程序上改了这样以后才接到正常信号的:

我在每个数据包之间加了一点延时,也就是 break 低电平信号之前的 MBB(Mark Befor Break),原来是在发送完最一帧之后马上拉低发送

break 低电平信号(此时是检测不到这个 break 信号的)

求解,这是为什么呢???

一般的发送DMX512信号的主控台的刷新频率是多大的,在数据包之间加一定延时吗??我看了下协议里是写(0《= MBB 《1s)

cunlingwang 发表于 2011-8-18 18:01:45

现在还不清楚如何用stm32的串口发送break,mark信号。 这个低电平如何控制呀?

kbdcj2000 发表于 2011-8-18 18:30:05

我记得PIC网站有一篇关于dmx512的应用笔记。LZ不妨登陆PIC网站,搜索一下。
在这个笔记中,break信号是通过另外一个IO来实现的。
看来这个笔记后,我对dmx512协议的理解是这样的:break信号是一个不正常的帧,是一个出左脚的帧。

yangbing2020 发表于 2013-10-5 16:32:16

强烈关注
页: [1]
查看完整版本: DMX512数据包发送时,break信号通过什么来实现?是串口信号是不行的,用IO来实现吗?同样,接