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