liuguang 发表于 2011-4-29 09:13:59

DMX512发送的问题

看了下DMX512的时序,写了一个程序,主机发送,从机接收,但现在从机收不到据,不知错在哪里,哪位帮我看一下。
        void main()
             {
            while(1){
          RDE=1;//发送控制端
          nBuffer=255;        //总调      nBuffer[]为通道数值
          nBuffer=2;        //R
          nBuffer=50;        //G
          nBuffer=250;        //B
            dmxout();
                }
               }
void dmxout()
{       
static uchar tt,ii;
          TXD=0;
                for(ii=100;ii>0;ii--);//delay 100 us
                TXD=1;
                for(ii=10;ii>0;ii--);//delay 10 us       

                TXD=0;                                //开始位
                TB8=0;                        //
                SBUF=0x00;       //start-code           起始码
          TXD=1;               //停止位
                for(ii=8;ii>0;ii--);//延时
                                TI=0;
       
                for(tt=1;tt<4;tt++){           //正常数据
                                TXD=0;                          //开始位
                                TB8=1;
                                SBUF=(nBuffer);//通道数值
                                TXD=1;                          //停止位
                                for(ii=8;ii>0;ii--);
                                TI=0;
                                }
                        TXD=1;               //        数据包停止位
}

lcw_swust 发表于 2011-4-29 09:35:42

for(tt=1;tt<4;tt++) 貌似只循环了三次
改成 for(tt=0;tt<4;tt++) 试试

liuguang 发表于 2011-4-29 09:44:39

回楼上的还是不行,
错在哪了

bbs2009 发表于 2011-4-29 10:11:56

liuguang 发表于 2011-4-29 10:44:49

波特率是250K,用控台可以收到数据,用主从机发就收不到,波特率是用定时器1来接收的,用的是STC12C5404

bbs2009 发表于 2011-4-29 11:19:20

kbdcj2000 发表于 2011-4-29 11:23:19

应该是break信号不正常吧

bbs2009 发表于 2011-4-29 11:34:51

bbs2009 发表于 2011-4-29 11:44:59

TFTscreen 发表于 2011-4-29 12:45:11

路过,支持一下!

xiaowu191 发表于 2011-4-29 13:04:22

不知道你的接收程序怎么写的,不过大同小异了;看样子你是检测RB8来判断BREAK的;

这样试试

先设置好串口(250K,9位数据,1停止位),如果你接了75176的话,还要把RE和DE管脚拉高

void dmxout()
{       
static uchar tt,ii;

TI=0;
TB8=0;       //
SBUF=0x00;       //break,替代你的TXD=0;for(ii=100;ii>0;ii--);TXD=1;
while(!TI);
TI=0;
//如果你的接收是通过判断RB8,且没延时才能这样,否则只能:
//TXD=0;
//for(ii=100;ii>0;ii--);//delay 100 us
//TXD=1;

TB8=1;
SBUF=0x00;       //start-code           起始码
while(!TI);
TI=0;

for(tt=1;tt<4;tt++) //正常数据
{          
SBUF=(nBuffer);//通道数值
while(!TI);
TI=0;
//for(ii=8;ii>0;ii--); //要确定延时时间足够,要么通过判断TI位
//TI=0;
}
}

bbs2009 发表于 2011-4-29 13:35:01

liuguang 发表于 2011-4-29 15:50:30

谢谢各位了!
按xiaowu191 小屋说的,已经搞定了,呵呵!
xiaowu191 小屋是做LED的吗?

bbs2009 发表于 2011-4-29 17:08:59

xiaowu191 发表于 2011-4-29 19:47:46

回复【12楼】bbs2009
-----------------------------------------------------------------------

谢谢指导,的确有不严谨的地方;
通过RB8来判断BREAK是可取的,当然适当的延时检测RX管脚信号低是最好的;
通过TB8=0,来当作BREAK信号只是自己内部使用的,像楼主这样的主从;

但如果是当作标准信号,比如做控台当然是不行的;

xiaowu191 发表于 2011-4-29 19:48:43

回复【13楼】liuguang
-----------------------------------------------------------------------

业余的,大家多多交流一下

liuguang 发表于 2011-4-29 21:17:41

谢谢两位的耐心指导,DMX512我不是很懂,有时间好好摸透一下。

boy_0909 发表于 2011-5-9 11:12:28

你们太专业了。我进来学习一下!

ssclark 发表于 2011-6-16 14:10:25

mark

cunlingwang 发表于 2011-8-25 16:09:57

mark

pcbboy 发表于 2011-11-15 11:14:22

mark

ppdd 发表于 2012-4-16 02:34:04

学习了!!

qq502835899 发表于 2012-11-30 19:27:53

mark 正在做这个;

laihappy 发表于 2022-8-17 20:51:28

本帖最后由 laihappy 于 2022-8-17 21:11 编辑

xiaowu191 发表于 2011-4-29 13:04
不知道你的接收程序怎么写的,不过大同小异了;看样子你是检测RB8来判断BREAK的;

这样试试
(引用自12楼)

我加您好友了,我没有权限发内邮
页: [1]
查看完整版本: DMX512发送的问题