谢谢各位的回复!
我的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);
}
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
//仅仅重排版,使程序读起来更容易。