我以前用过MEGA64和51做RS485通讯效果都很好,但是这次用PIC16F877A就遇到比较麻烦的问题,请各位高手指点!!
应用要求:一个主控板,通过轮询方式访问多个子节点。轮询时间间隔是0.5s
硬件:MAX487,用光耦TLP521隔离,单片机是PIC16F877A
问题:主控板连续发送数据时(不切换到接收状态,只是发送状态),子节点接收正常。但是,当主控板发送完数据,从发送状态切换到接收状态时,子节点的接收就报错,而且数据接收失败!!
曾试过的方法:读取TXIF和TRMT标志位判断发送完,然后切换到接收状态;
读取TXIF和TRMT标志位判断发送完,再加延时,然后再切换到接收状态。但是无论延时有多长,还是出现同样的问题。
代码如下:用C写的
RCIE=0; //禁止接收中断
RD6=0; //允许发送(RD6为MAX487的控制引脚:0为发送;1为接收)
for(i=0;i<10;i++);
TXREG=TXdata;
TXEN=1; //使能发送
for(i=0;i<250;i++);
TXEN=0; //禁止发送
while(TXEN==1||TRMT==0)
{;}
RCIE=1;
RD6=1; //问题就在这命令,如果不执行这命令,子节点的接收完全正常
//如果执行这命令,子节点的接收就报错,而且接收不到数据
也试过在中断中发送
if(TXIE&&TXIF)
{
char i;
TXREG=TXdata;
for(i=0;i<10;i++);
TXIE=0;
while(TRMT==0&&TXIF==0)
{;}
RCIE=1;
RD6=1;
}
请问各位大侠有什么好建议和好方法呢?
请各位大侠指点!!小弟急!!先谢过各位的仗义!!
此帖出自
小平头技术问答
TXEN=1; // Enable transmitter
TXREG=TXdata; // Write data to the buffer
while(TRMT==0) // Spin while transmitting
{;}
TXEN=0; // Disable transmitter
for(i=0;i <250;i++); // Idle for a while
RD6=1; // Switch the mode to RX
RCIE=1; // Enable Rx Interrupt
一周热门 更多>