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; // 数据包停止位
} for(tt=1;tt<4;tt++) 貌似只循环了三次
改成 for(tt=0;tt<4;tt++) 试试 回楼上的还是不行,
错在哪了 波特率是250K,用控台可以收到数据,用主从机发就收不到,波特率是用定时器1来接收的,用的是STC12C5404 应该是break信号不正常吧 路过,支持一下! 不知道你的接收程序怎么写的,不过大同小异了;看样子你是检测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;
}
} 谢谢各位了!
按xiaowu191 小屋说的,已经搞定了,呵呵!
xiaowu191 小屋是做LED的吗? 回复【12楼】bbs2009
-----------------------------------------------------------------------
谢谢指导,的确有不严谨的地方;
通过RB8来判断BREAK是可取的,当然适当的延时检测RX管脚信号低是最好的;
通过TB8=0,来当作BREAK信号只是自己内部使用的,像楼主这样的主从;
但如果是当作标准信号,比如做控台当然是不行的; 回复【13楼】liuguang
-----------------------------------------------------------------------
业余的,大家多多交流一下 谢谢两位的耐心指导,DMX512我不是很懂,有时间好好摸透一下。 你们太专业了。我进来学习一下! mark mark mark 学习了!! mark 正在做这个; 本帖最后由 laihappy 于 2022-8-17 21:11 编辑
xiaowu191 发表于 2011-4-29 13:04
不知道你的接收程序怎么写的,不过大同小异了;看样子你是检测RB8来判断BREAK的;
这样试试
(引用自12楼)
我加您好友了,我没有权限发内邮
页:
[1]