打印

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

[复制链接]
13143|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 | 只看该作者
时序不是很准

使用特权

评论回复
5
zjq_go|  楼主 | 2009-9-17 08:20 | 只看该作者
书生同志,您说明白点啊。
按照协议是250K的速率啊,哪里不准

使用特权

评论回复
6
zjq_go|  楼主 | 2009-9-17 15:01 | 只看该作者
等待

使用特权

评论回复
7
冷漠| | 2009-9-17 15:18 | 只看该作者
嘻嘻,书生跟LZ开玩笑呢,哪里是时序问题?根本就是程序问题!

使用特权

评论回复
8
zjq_go|  楼主 | 2009-9-17 17:43 | 只看该作者
程序什么问题呢?怎么都说一半留一半?

使用特权

评论回复
9
冷漠| | 2009-9-17 19:35 | 只看该作者
看来咱得认真对待了。不过LZ自己有点没讲清楚。待俺重新写一遍。

使用特权

评论回复
10
冷漠| | 2009-9-17 20:47 | 只看该作者
差的太远了!
第一句就错了: SCON=0x90;  //?????
你既然是多机通信中的一个从站,SM2应该先设置为1。才能根据RB8区别出主站轮询的是哪个节点。这一点概念没错吧。

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

什么条件下才能肯定发送给自己的是数据帧?写清楚。

使用特权

评论回复
11
yixiupu0| | 2009-9-17 21:29 | 只看该作者
做LED一般做法是用一片来接收DMX信号,收到后发给另外一片来做灰度,如果你也是这种方式,那你看看你是否在发送数据到另一处MCU时关了串口接收中断.
贴出来的好像还有一些笔误吧.

使用特权

评论回复
12
呆板书生| | 2009-9-17 21:47 | 只看该作者
不好意思,插一句嘴,dmx512 的协议中信号返回,一般不轮询。

嗯,我在听课,冷先生,请继续讲,谢谢。

使用特权

评论回复
13
zjq_go|  楼主 | 2009-9-18 08:16 | 只看该作者
看来冷先生不了解DMX512协议啊
1、SM2设为1是不行的,因为要找到复位信号,复位信号的RB8位是0。
2、DMX512信号不发送地址位,格式是先一个复位信号然后连续发送512帧的信号(这个不一定,看调光台控制的路数而定,12路的调光台就连续发12帧数据),如此重复。
    所有从机并在RS485总线上,怎么判断是自己的信号呢?从机必须有个地址,比如某一从机地址为8,那么主机发送的第八帧数据就是这个从机的调光信号。
    请冷先生先了解清楚协议再说

使用特权

评论回复
14
zjq_go|  楼主 | 2009-9-18 08:19 | 只看该作者
我程序中的TEMP就是从机的地址
NUM就是主机发送的帧数

使用特权

评论回复
15
zjq_go|  楼主 | 2009-9-18 08:20 | 只看该作者
不知道我是否说清楚了

使用特权

评论回复
16
zjq_go|  楼主 | 2009-9-18 08:25 | 只看该作者
回11楼:
     没有笔误啊,有笔误怎么可能接收到12路的调光台。
     请问发送到另一个MCU为什么要关中断?
     我程序中P2=SBUF,就是发送到另一个MCU啊(两个MCU是通过P2口连得),这仅仅是取出数据,为什么要关中断?请赐教

使用特权

评论回复
17
冷漠| | 2009-9-18 08:37 | 只看该作者

没看到13、14楼的帖子。

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

原来LZ第一句没错。

使用特权

评论回复
18
zjq_go|  楼主 | 2009-9-18 12:25 | 只看该作者
你要我说你什么好?叫你了解DMX512协议再说,别人都不懂多机通信,就你懂。
RB8再多机通信中是为了区别地址帧和数据帧。
这里不同,DMX512协议根本就没有地址帧,我不是说了吗?
   还是谢谢你,虽然风马牛不相及。
   现在问题已经解绝了,把NUM和TEMP 改成CHAR型变量就可以了

使用特权

评论回复
19
冷漠| | 2009-9-18 16:24 | 只看该作者
惭愧了,不知道协议内容瞎说了。13楼协议讲清楚了。

多机通信,昨天刚学的,现学现卖。

使用特权

评论回复
20
zjq_go|  楼主 | 2009-9-18 22:25 | 只看该作者
呵呵,不好意思

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

164

帖子

1

粉丝