① 请教各位大侠,关于单片机长时间运行死机的问题
长时间运行死机的原因相对也算多:
①有振荡器(特别是陶瓷振荡器)振荡不良,长时间运行后,振荡器停振导致单片机死机。
②有单片机(特别是国产某晶)性能不佳,平均每1~1月就有一次死机。
③有设计(硬件抗扰)不佳,使用环境出现恶劣条件(各种干扰:静电、电磁、脉冲……),导致单片机死机。
…………
对于①,重新上电,99%以上能恢复正常,1%振荡器就坏了。
对于②,重新上电,100%能恢复正常。
对于③,重新上电,50%~70%能恢复正常,剩下的,很可能被静电击穿MCU,导致永久性损坏。
解决方法:
对于①,采用晶体振荡器(就是晶振,金属外壳那种,记得匹配好旁路电容)。
对于②,更换工业性能稳定的单片机品牌。
对于③,硬件设计考虑多点环境干扰,这对硬件工程师要求比较高,不是毕业生或工作经验一年两年的人能做的。必须有相关行业经验的工程师,不然就是工作10年8年也没这能力。(更换工业性能良好的单片机,可以将“重新上电恢复正常”提高到80%~90%,但不能解决死机。)
② 单片机一串口通信结束就复位或者死机是为什么
while中有别的处理函数一直执行会占CPU。复位应该是喂狗的问题。
看门狗需要在规定时间内喂狗,这里所说的“规定时间”就是看门狗定时器计数溢出时间,即一旦到达计数阈值,看门狗就会产生复位。CPU必须在这个周期内对这个定时器进行清零处理,让看门狗定时器重新计数,防止看门狗产生复位。
③ 串口发送数据死机,请问以下程序为什么发送一个字节后单片机死机 for(j=0;j<10;j++) //用串口调试工具显示
我刚刚也遇到这样的问题,终于明白怎么回事了。你应该写了收发中断函数,而且发送中断中有TI=0,程序有时会在while(TI==0)处死机:执行到while(TI==0)时发送完成的时候while循环还未退出,单片机就进入了中断函数,并将TI置为0,然后再次回到发送函数时TI已经是0了,执行while(TI==0)形成死循环。
④ 请教串口通信中容易死机的问题
按正常的通信,与死机是毫无关系的,也就是不会因为通信造成死机的,如果一通信就死机,那还怎么通信了,还要什么串口啊,干脆去掉算了,所以,这是不可能的事,一定是因为你的程序有错误。
但没有看到你的程序是怎么写的,所以,也不好判断是什么原因。
也不知道你是什么单片机,用什么语言写的程序。
不过,可以提供一点参考意见,就是写接收数据程序时,一定要用中断来接收,千万不要用查询方式来接收,因为一旦开始查询接收,就进入死循环了,如果没有收到数据就相当于死机状态。所以,这是一定是避免的。
否则,串口通信是不会死机的。
⑤ 单片机串口发送数据就死机,这是怎么回事
UART_Send_Byte(s[i]);这又调用了一个函数,这个函数在哪里?是怎么写的?是查询方式发送的吗?每发送一个字节要等待,即必须要有while(!TI);TI=0;这两行的。还有串口初始化的程序在哪里,main()主程序中并没有初始化。你这程序什么都不写,就发送数据呀,不死机才怪了。
⑥ 单片机串口死机,发送一个命令进去执行一次就没反应了,必须重启单片机,这是怎么回事
1、你滴,是神马单片机?这么牛,能直接发送汉字?还能只要一个地址传递就能将英汉混合字符串分存成单字节Byte(s[i])数组? 如果单片机不能,那么是你滴编译系统能?
2、你滴单片机串口收/发中断是能分开设置是否中断滴么?看你程序收用中断发用查询,51不能分设吧?
3、在没有FIFO的单片机里,一般串口收/发完成1个字节会中断一次,看你程序貌似是发完一串字符才置位TI,这样用当然是不对滴。正确的方法是发完一个字节中断后再发下一个字节(有点烦是吧^_^); 试试下面的方式调试:
unsigned char s[]={0,1,2,3,4,5,6,7,8,9};
unsigned char len = 10;
void sio_int() interrupt 4 //串口中断函数
{
if (RI )
{
RI = 0;
……
}
if(TI)
{
TI = 0;
if(len)
{
SBUF = s[10 - len ];
len--;
}
}
}
⑦ 单片机死机的原因求助高手
单片机死机的原因,通常是因为周围环境干扰比较严重,如工厂车间各种机器,电焊机等工作时,就是产生很强的干扰脉冲,加上单片机的防干扰措施不到位,就是会被干扰破坏了正常的动行,造成飞程序,进入死机状态。
如果是在这种环境下的单片机,就是做好防干扰措施。
⑧ STM32单片机程序死机,有哪些原因引起
1、意外中断。是否打开了某个中断,但是没有响应和清除中断标志,导致程序一直进入中断,造成死机假象。
2、中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile。
其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
其他原因:
1、地址溢出。常见错误为指针操作错误。要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
2、无条件的死循环。比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;
3、看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;
4、堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当把以上几条都试过不能解决问题,试一试把被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量。
⑨ 串口通信 单片机&VB 死死卡住了~~~大家帮帮忙
Option Explicit
Dim strData As String
Dim bytInput() As Byte
Private Sub Form_Load()
MSComm1.Settings = "2400,n,8,1"
MSComm1.CommPort = 4
MSComm1.RThreshold = 1
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub
Private Sub MsComm1_OnComm()
Dim intInputLen As Integer
Select Case Me.MSComm1.CommEvent
Case comEvReceive
'此处添加处理接收的代码
Me.MSComm1.InputMode = comInputModeBinary '二进制接收
intInputLen = Me.MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = Me.MSComm1.Input
jieshou
End Select
End Sub
Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(bytInput)
If Len(Hex(bytInput(i))) = 1 Then
strData = strData & "0" & Hex(bytInput(i))
Else
strData = strData & Hex(bytInput(i))
End If
Next
Text1 = strData
End Function