串口通信速度过快导致单片机重启??
SOS!!!!!用RS485串口通信,PC接上51。设置串口助手的自动发送周期为10ms,PC发送一串数据单片机返回一串应答码??单片机运行不到0.5s便重启?????
程序开始运行时设置了开始声响,LED灯由暗变亮~~~~死机后,程序竟跳到main开始!!??
是不是单片机在发送,而串口助手也在发送,导致数据出错,而影响到单片机??? 无图无程序无真相。485是半双工,你可以根据波特率计算传输你所要的字节数要多少时间。如果你只能单缓冲区并且发送周期很短,很可能缓冲区溢出,然后就。。。 内存溢出???????? 怎么会溢出呢!!??? 建议你先试一下测试程序,看看10ms发一次数会不会出现你说的问题 后来如果把单片机的波特率加到115200就不会出现类似的问题,但是如果波特率是在19200,或者其他的,只要串口发送的速率过快,单片机就会死机了 那是溢出了。。。。 溢出了?……那是在那里溢出了呢??? 换了其他的51型号也是如此。计算过之后,单片机发送回来的数据有23个字节,波特率是19200,单片机发回来大概需要9.5ms,串口发送19个字节,需要8.0毫秒,加起来大概需要18ms。而串口利用自动发送,发送周期需要大于等于18ms,单片机才不会死机,重启。否则,小于18ms的就会死机,重启。
这是溢出问题吗???或者是其他原因??? 在发送时,对REN清零就可以避免死机。就是说,问题出现在收发同时出现的情况??? 这种情况很诡异噢。表示不知道。是不是你的狗没关,导致你的片子没有时间喂狗?一般来说缓冲溢出不会死机吧(至少单片机的FIFO都是独立出来的),顶多是漏掉一部分。 缓冲区溢出,很时髦的哦,51就那一二百字节,直接把堆栈爆掉,然后么,就一直nop,nop,nop或mov r7,0xff到pc溢出, 呵呵,缓冲区溢出这种事情 100% 是代码编写错误。 本帖最后由 yiyu 于 2012-6-1 19:24 编辑
Cojumos 发表于 2012-6-1 16:39 static/image/common/back.gif
在发送时,对REN清零就可以避免死机。就是说,问题出现在收发同时出现的情况??? ...
485你的txd和rxd同时接一起了吧, 在发送的时候不关闭接收,你对rxbuf又没有保护, 建议接收处理这个样子
c = sbuf;
if( rxcnt < sizeof(rxbuf) )
rxbuf = c; yiyu 发表于 2012-6-1 19:19 static/image/common/back.gif
485你的txd和rxd同时接一起了吧, 在发送的时候不关闭接收,你对rxbuf又没有保护, 建议接收处理这个样子 ...
485的TXD,RXD怎么能接一起呢???附上电路图。
这里应该也作保护了吧!
void Receive_Data(uchar Data)
{
if(Rec_Count>=REC_BUF_LENGTH-2) Rec_Count=0;
else
Rec_Buf=Data;
……
}
其实如果是溢出的问题,缓冲又是如何发生溢出的呢?
求解释
yiyu 发表于 2012-6-1 17:32 static/image/common/back.gif
缓冲区溢出,很时髦的哦,51就那一二百字节,直接把堆栈爆掉,然后么,就一直nop,nop,nop或mov r7,0xff到p ...
缓冲区溢出~~????
SBUF溢出吗????
mangocity 发表于 2012-6-1 18:46 static/image/common/back.gif
呵呵,缓冲区溢出这种事情 100% 是代码编写错误。
那请问是不是在发送或者接收,接收处理的时候代码出错了呢 一个破51,怎么会产生RAM溢出?难道接收时存放到RAM区,不做溢出判断?我做过9600bps无停顿通信,连续测试2周多,不关机,一点事儿都没有。
RI = 0;
rec_ buf = SBUF;
rec_buf_point++;
rec_buf_point %= REC_BUF_LONG; // 加了这个限制,发到51报废都不会造成重启啊 按楼上的方法试过了,发现并不是这个问题
页:
[1]