大家好,很高興和各位一起分享我的第45篇原創(chuàng)文章,喜歡和支持我的工程師,歡迎給我點贊、收藏、分享。
加微信[xyzn3333]與作者溝通交流,免費獲取更多單片機與嵌入式的海量電子資料。
歡迎關(guān)注【玩轉(zhuǎn)單片機與嵌入式】公眾號,回復(fù)關(guān)鍵字獲取更多免費資料。
回復(fù)【3D封裝庫】,常用元器件的3D封裝庫;
回復(fù)【電容】,獲取電容、元器件選型相關(guān)的內(nèi)容;
回復(fù)【阻抗匹配】,獲取電磁兼容性、阻抗匹配相關(guān)的資料
回復(fù)【資料】,獲取全部電子設(shè)計、單片機開發(fā)相關(guān)的資料
回復(fù)【終端電阻】,獲取CAN終端電阻相關(guān)的資料
回復(fù)【單片機】,獲取單片機全套視頻教程和參考設(shè)計
回復(fù)【STM32】,獲取STM32相關(guān)設(shè)計和視頻教程
回復(fù)【PCB】,獲取PCB設(shè)計相關(guān)的資料
回復(fù)【硬件知識】、【硬件設(shè)計】,獲取硬件開發(fā)工程必備手冊
回復(fù)【經(jīng)典電路】,獲取5000個經(jīng)典電路
回復(fù)【論文】,獲取畢業(yè)設(shè)計、電子競賽、學(xué)術(shù)專業(yè)等相關(guān)論文資料
…………
歡迎關(guān)注【玩轉(zhuǎn)單片機與嵌入式】公眾號,本公眾號會以連載的形式對電容進行深入講解,歡迎持續(xù)關(guān)注。
0、前言
某天,正在公司專心上班,為了一行代碼應(yīng)該如何優(yōu)化絞盡腦汁;突然接到售后服務(wù)同事的電話:"告訴你一個不好的消息,xx客戶處的設(shè)備,出現(xiàn)上電后慢速行駛燈會無規(guī)律閃爍的情況"。
由于從事的行業(yè)比較特殊,任何的異常都有可能導(dǎo)致涉及人命的安全事故;再加上“事出異常必有妖”,這種心態(tài)的作用。客戶反饋的事情瞬間提升到最高優(yōu)先級。
趕緊放下手頭事情,整個人被“中斷”出去處理緊急異常事故。
1、故障復(fù)現(xiàn)
按照現(xiàn)場的工作條件,在公司搭建測試環(huán)境后,發(fā)現(xiàn)異常果然存在。但是只在A設(shè)備搭配B設(shè)備通信時出現(xiàn)異常。
2、排查事故影響范圍
由于閃爍的是慢速行駛燈,若正常在快速行駛狀態(tài)中,突然出現(xiàn)慢速行駛,會由于突然的速度變化導(dǎo)致不可預(yù)估的風(fēng)險;
在測試中發(fā)現(xiàn),僅僅是指示燈閃爍了一下,但實際行走模式未發(fā)生改變。懸著的心突然有了一絲絲安慰。
3、排查原因及步驟
1、A設(shè)備燈的狀態(tài)是由B設(shè)備的工作模式來決定,B設(shè)備將自身的工作模式和模式狀態(tài)實時(每10ms)發(fā)送給A設(shè)備,A設(shè)備僅僅負(fù)責(zé)根據(jù)數(shù)據(jù)執(zhí)行即可。
2、監(jiān)聽A設(shè)備和B設(shè)備通信的數(shù)據(jù),發(fā)現(xiàn)B設(shè)備發(fā)送數(shù)據(jù)有丟失。按照理論來看,B設(shè)備發(fā)送數(shù)據(jù)有丟失,A設(shè)備應(yīng)該不解析本報數(shù)據(jù),本次10ms周期不進行指示燈狀態(tài)切換即可,不應(yīng)該出現(xiàn)閃爍。
3、模擬B設(shè)備故意每次均少發(fā)指示燈狀態(tài)的數(shù)據(jù);現(xiàn)象為A設(shè)備的指示燈完全不亮,符合邏輯;
4、模擬B設(shè)備僅少發(fā)1個周期的指示燈狀態(tài)數(shù)據(jù),其余周期正常;測試現(xiàn)象與故障現(xiàn)場的現(xiàn)象完全一致,B設(shè)備數(shù)據(jù)導(dǎo)致導(dǎo)致了本次事故。
5、基于以上的分析,將問題鎖定在2個方向:
-
B設(shè)備為什么會丟失數(shù)據(jù)?
-
B設(shè)備丟失數(shù)據(jù)時,A指示燈為何會閃爍?
4、問題的根源定位
檢查A設(shè)備的程序后,很快發(fā)現(xiàn)了問題原因:僅丟失一包數(shù)據(jù)時,由于后面的數(shù)據(jù)校驗錯誤,解析數(shù)據(jù)時將CRC值當(dāng)做正常數(shù)據(jù)進行了解析;
通過更新A設(shè)備的程序,故障不再復(fù)現(xiàn)。
檢查B設(shè)備的程序查找數(shù)據(jù)丟失的根本原因。因為簡單的知識點盲區(qū),卡住了2天。最終查到的問題原因如下:
B設(shè)備發(fā)送使用了串口發(fā)送中斷,更改前的流程:
更改后的流程:
5、知識點掃盲
STM32的串口發(fā)送中斷是TC,即Transmission Complete。發(fā)送一個字節(jié)后才進入中斷,這里稱為“發(fā)送后中斷”。和原來8051的TI方式一樣,都是發(fā)送后才進中斷,需要在發(fā)送函數(shù)中先發(fā)送一個字節(jié)觸發(fā)中斷。并不是開啟發(fā)送中斷后自動進入發(fā)送中斷。
End