串口通信速度过快导致单片机重启??

2020-02-05 09:10发布

SOS!!!!!用RS485串口通信,PC接上51。设置串口助手的自动发送周期为10ms,PC发送一串数据单片机返回一串应答码??

单片机运行不到0.5s便重启?????

程序开始运行时设置了开始声响,LED灯由暗变亮~~~~死机后,程序竟跳到main开始!!??

是不是单片机在发送,而串口助手也在发送,导致数据出错,而影响到单片机???

换了其他的51型号也是如此。计算过之后,单片机发送回来的数据有23个字节,波特率是19200,单片机发回来大概需要9.5ms,串口发送19个字节,需要8.0毫秒,加起来大概需要18ms。而串口利用自动发送,发送周期需要大于等于18ms,单片机才不会死机,重启。否则,小于18ms的就会死机,重启。

这是溢出问题吗???或者是其他原因???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Cojumos
1楼-- · 2020-02-05 13:59
在发送时,对REN清零就可以避免死机。就是说,问题出现在收发同时出现的情况???
Cojumos
2楼-- · 2020-02-05 19:48
485也出现这样的情况!!?

这个是发送程序,串口通信则屏蔽485线
void RS485_Send(uchar Data)
{
TI=0;

// RS485_TXDEN = WRITE_485;

SBUF = Data;      //send data to buffer

while(!TI);
TI=0;        //reset End-send flag bit

// RS485_TXDEN = READ_485;

}


中断处理函数
/***********************************************
* Name:  Receive_Data(ucahr Data)
* Describe: main fuction
* Return:  None
***********************************************/
void Receive_Data(uchar Data)
{
if(Rec_Count>=REC_BUF_LENGTH-2) Rec_Count=0;

else
  Rec_Buf[Rec_Count]=Data;

if(Rec_Buf[0] == DATA_HEAD)  Rec_Count++;  //count from Data_Head

}



中断程序

void USRAT_int() interrupt 4
{
uchar Data;

EA=0;

if(RI)
{
  Data = SBUF;

//  RS485_Send(Data);
  Receive_Data(Data);

  RI=0;
}// end of if(RI)

EA=1;  
}

mored
3楼-- · 2020-02-06 01:27
好的程序,不只在于正确输入时能做正确的事,还在于不正确的输入时不会做不正确的事
614229816
4楼-- · 2020-02-06 07:13
mored 发表于 2012-6-1 17:38
好的程序,不只在于正确输入时能做正确的事,还在于不正确的输入时不会做不正确的事 ...

楼上的经典
但是怎么在不正常的做不正常的事。
Cojumos
5楼-- · 2020-02-06 08:02
 精彩回答 2  元偷偷看……
mored
6楼-- · 2020-02-06 09:12
哦,我的意思只是说多查查如果输入数据不对的话,程序会有什么反应
很明显的问题是Receive_Data中的else是多余的,uart中断没clr TI,
但是这两个都不至于导致复位

一周热门 更多>