打印

为什么485不能连续接收?

[复制链接]
4786|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chencheng|  楼主 | 2011-9-18 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的硬件是STC11F04XE的uart连接MAX485,共4套连接在总线上,线长40cm。其中三个单片机处于接受状态,一个处于发送状态。进过反复试验发现:如果无间隔连续发送4个字节数据,那么只能收到前2个字节。如果间隔1秒或更长时间连续发送,无论多少字节都能正确接收。又用PC机串口转485与一个单片机点对点通信,单片机程序为中断收到4个字节数据后,转发该4字节数据(无间隔连续发送)。用串口调试助手,一次发送一个字节,发送4次,能收到转发回来的同样4字节数据。鼠标快速连续点击4次发送,单片机不能转发,再点击2-3次发送,才能收到4字节转发过来的数据。若一次发送4字节数据,则发送2次即共发送8字节数据,才收到4字节转发回来的数据,且是两次发送的前2字节。
上述现象,调试无数遍都如此。更换过不同渠道的MAX485以及不同种类的单片机,现象依旧。是485就不能连续接收?不应该!头大,不知该如何调试?请高手指点,给我邮件。c86518@163.com

相关帖子

沙发
xyz769| | 2011-9-18 20:49 | 只看该作者
 程序?原理图?

使用特权

评论回复
板凳
chunyang| | 2011-9-19 00:45 | 只看该作者
注意485接口芯片在收发转换后要延时至少1mS后再送数据,另外注意硬件电路结构。

使用特权

评论回复
地板
chencheng|  楼主 | 2011-9-19 21:23 | 只看该作者
我的STC11F04XE单片机程序如下,中断接收数据,主程序中判断收到4个字节数据就转发。
PC串口转485通过MAX485与单片机UART连接。调试助手发送单个字节,发送4次,能正确收到转发回来的数据。一次发送4个字节,则必须发送两次,才能收到转发回来的4个字节数据,不过该数据是两次发送的前2个字节。
用示波器观察MAX485的数据接收端RI,波形很好。无论发送单字节还是4字节,波形都正确!问题应该在程序。请各位帮助我分析一下程序,我可能陷入某个误区。
void Serial0_ISR() interrupt 4
{
unsigned char temp;
EA=0; //disable interrupt
if (RI)
{
RI=0;
temp=SBUF; //读取串口接收字节
RxData[RxCounter]=temp; //接收数据,4字节
RxCounter++;
}
}
//-------------------------------------------------------------------
void SendChar(unsigned char temp)
{
SBUF=temp;
while(TI==0);
TI=0;
}
/********************************************************************/
void main (void)
{
unsigned char i;
ini8051();
delayxms(200); //延时一段时间
// CLRWDT(); //start watchdog
RxCounter =0; //串行口接收数据计数器
RS485T1R0=0; //485接收
start3:
RS485T1R0=0; //485接收
ES=1; //enable UART interrupt
EA=1; //enable interrupt

if (RxCounter <4) goto noRevDa;//一帧数据,4字节

//命令协议解析处理
ES=0; //disable UART interrupt
RxCounter=0;

//转发485收到的数据
RS485T1R0=1; //485发送
_nop_(); _nop_(); _nop_(); _nop_();
// for (i=5;i>0;--i) delayxms(200); //delay 1 seconds
for (i=0;i<4;i++)
{
SendChar(RxData[i]);
}
ES=1; //enable UART interrupt  

RS485T1R0=0; //485接收
for (i=0;i<3;i++) //LED闪烁3次,调试观察
{
LED1=0; delayxms(200);
LED1=1; delayxms(200);
}

noRevDa:
// ES=1; //enable UART interrupt
EA=1; //enable interrupt
// RS485T1R0=1; //485发送
LED1=0;  //LED亮灭,调试观察
for (i=10;i>0;--i) delayxms(200); //delay 1 seconds
LED1=1;
for (i=10;i>0;--i) delayxms(200); //delay 1 seconds
_nop_();
goto start3;
} // end of main

使用特权

评论回复
5
xyz769| | 2011-9-20 21:36 | 只看该作者
本帖最后由 xyz769 于 2011-9-20 21:37 编辑

从LZ程序风格看,以前应该是搞汇编的吧?:D

程序不完整,RxCounter 你怎么定义的?是不是被keil过度优化了?

使用特权

评论回复
6
chencheng|  楼主 | 2011-9-22 20:02 | 只看该作者
问题解决了。原因是中断服务程序中只有EA=0;没有EA=1。这样,主程序延时阶段就只能响应一次接收中断。

使用特权

评论回复
7
chencheng|  楼主 | 2011-9-22 20:02 | 只看该作者
谢谢各位!

使用特权

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

本版积分规则

6

主题

116

帖子

1

粉丝