導航:首頁 > 操作系統 > 單片機串口堵塞死機

單片機串口堵塞死機

發布時間:2022-07-08 23:24:42

① 請教各位大俠,關於單片機長時間運行死機的問題

長時間運行死機的原因相對也算多:
①有振盪器(特別是陶瓷振盪器)振盪不良,長時間運行後,振盪器停振導致單片機死機。

②有單片機(特別是國產某晶)性能不佳,平均每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。

其次在主循環中讀取中斷變數前應該首先關閉全局中斷,防止讀到一半被中斷給修改了,讀完之後再打開全局中斷;否則出現造成數據亂套。

(8)單片機串口堵塞死機擴展閱讀:

其他原因:

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

閱讀全文

與單片機串口堵塞死機相關的資料

熱點內容
android怎麼搭建框架 瀏覽:172
正宗溯源碼大燕條一克一般多少錢 瀏覽:917
電腦感染exe文件夾 瀏覽:916
wpsppt怎麼轉pdf格式 瀏覽:88
騰訊文檔在線編輯怎麼添加密碼 瀏覽:880
本地不能訪問伺服器地址 瀏覽:865
訪問伺服器命令 瀏覽:835
華為雲伺服器分銷商 瀏覽:954
Linux定位內存泄露 瀏覽:198
工程加密狗視頻 瀏覽:720
不在內網怎麼連接伺服器 瀏覽:664
雲伺服器app安卓下載 瀏覽:966
如何查看linux伺服器的核心數 瀏覽:137
交易平台小程序源碼下載 瀏覽:148
程序員記筆記用什麼app免費的 瀏覽:646
java與單片機 瀏覽:897
伺服器內網如何通過公網映射 瀏覽:478
程序員穿越到宋代 瀏覽:624
怎麼使用雲伺服器掛游戲 瀏覽:620
真實的幸福pdf 瀏覽:346