有高手懂DMX512通信协议吗?帮我看看这段接收程序

[复制链接]
14283|26
 楼主| zjq_go 发表于 2009-9-16 18:46 | 显示全部楼层 |阅读模式
用的51单片机,接受12路的调光台没有问题,可是接在珍珠台上,一至十路也没什么问题,十路以后就开始混乱,路数越大越乱,发现十路以后接收的不只是本地址,比如我设置的地址15,单片机一会接受15路的信号,一会接收16路的信号。越到后面接受的旁路信号越多。求高手指点
  下面是接受子函数:

  SCON=0x90;
  PCON=0x80;
  EA=1;
  ES=1;       ;//初始化函数,晶振8M

void see() interrupt 4             ;//串口中断
{
  if(RI==1)
   {
      
      if(!RB8)
     {  flag2=1;
       num=0;
}
     else if(flag2)
      {
     
              if(num==temp)            //temp 是我自己设定的地址
               {
   P2=SBUF;         //取出数据
                        flag2=0;
                         num=0;
       }  
            
   num++;
           }     
        RI=0;
   }
   
}
  
谢谢!
 楼主| zjq_go 发表于 2009-9-16 22:17 | 显示全部楼层
没人懂吗?
 楼主| zjq_go 发表于 2009-9-17 01:18 | 显示全部楼层
还是没人知道?
呆板书生 发表于 2009-9-17 07:00 | 显示全部楼层
时序不是很准
 楼主| zjq_go 发表于 2009-9-17 08:20 | 显示全部楼层
书生同志,您说明白点啊。
按照协议是250K的速率啊,哪里不准
 楼主| zjq_go 发表于 2009-9-17 15:01 | 显示全部楼层
冷漠 发表于 2009-9-17 15:18 | 显示全部楼层
嘻嘻,书生跟LZ开玩笑呢,哪里是时序问题?根本就是程序问题!
 楼主| zjq_go 发表于 2009-9-17 17:43 | 显示全部楼层
程序什么问题呢?怎么都说一半留一半?
冷漠 发表于 2009-9-17 19:35 | 显示全部楼层
看来咱得认真对待了。不过LZ自己有点没讲清楚。待俺重新写一遍。
冷漠 发表于 2009-9-17 20:47 | 显示全部楼层
差的太远了!
第一句就错了: SCON=0x90;  //?????
你既然是多机通信中的一个从站,SM2应该先设置为1。才能根据RB8区别出主站轮询的是哪个节点。这一点概念没错吧。

后面就更乱了。
“  if(num==temp)            //temp 是我自己设定的地址
               {
   P2=SBUF;         //取出数据
                        flag2=0;
                         num=0; ” //???????

什么条件下才能肯定发送给自己的是数据帧?写清楚。
yixiupu0 发表于 2009-9-17 21:29 | 显示全部楼层
做LED一般做法是用一片来接收DMX信号,收到后发给另外一片来做灰度,如果你也是这种方式,那你看看你是否在发送数据到另一处MCU时关了串口接收中断.
贴出来的好像还有一些笔误吧.
呆板书生 发表于 2009-9-17 21:47 | 显示全部楼层
不好意思,插一句嘴,dmx512 的协议中信号返回,一般不轮询。

嗯,我在听课,冷先生,请继续讲,谢谢。
 楼主| zjq_go 发表于 2009-9-18 08:16 | 显示全部楼层
看来冷先生不了解DMX512协议啊
1、SM2设为1是不行的,因为要找到复位信号,复位信号的RB8位是0。
2、DMX512信号不发送地址位,格式是先一个复位信号然后连续发送512帧的信号(这个不一定,看调光台控制的路数而定,12路的调光台就连续发12帧数据),如此重复。
    所有从机并在RS485总线上,怎么判断是自己的信号呢?从机必须有个地址,比如某一从机地址为8,那么主机发送的第八帧数据就是这个从机的调光信号。
    请冷先生先了解清楚协议再说
 楼主| zjq_go 发表于 2009-9-18 08:19 | 显示全部楼层
我程序中的TEMP就是从机的地址
NUM就是主机发送的帧数
 楼主| zjq_go 发表于 2009-9-18 08:20 | 显示全部楼层
不知道我是否说清楚了
 楼主| zjq_go 发表于 2009-9-18 08:25 | 显示全部楼层
回11楼:
     没有笔误啊,有笔误怎么可能接收到12路的调光台。
     请问发送到另一个MCU为什么要关中断?
     我程序中P2=SBUF,就是发送到另一个MCU啊(两个MCU是通过P2口连得),这仅仅是取出数据,为什么要关中断?请赐教
冷漠 发表于 2009-9-18 08:37 | 显示全部楼层

没看到13、14楼的帖子。

本帖最后由 冷漠 于 2009-9-18 18:42 编辑

原来LZ第一句没错。
 楼主| zjq_go 发表于 2009-9-18 12:25 | 显示全部楼层
你要我说你什么好?叫你了解DMX512协议再说,别人都不懂多机通信,就你懂。
RB8再多机通信中是为了区别地址帧和数据帧。
这里不同,DMX512协议根本就没有地址帧,我不是说了吗?
   还是谢谢你,虽然风马牛不相及。
   现在问题已经解绝了,把NUM和TEMP 改成CHAR型变量就可以了
冷漠 发表于 2009-9-18 16:24 | 显示全部楼层
惭愧了,不知道协议内容瞎说了。13楼协议讲清楚了。

多机通信,昨天刚学的,现学现卖。
 楼主| zjq_go 发表于 2009-9-18 22:25 | 显示全部楼层
呵呵,不好意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部